柔性数组详解
2023-12-13 04:48:45
前言:柔性数组是C99中新添加的概念,它是结构体里面的最后一个成员,因为它的大小未知,所以很灵活,称之为柔
1 柔性数组占不占结构体的空间呢?
? ?不占
typedef struct Stu
{
char y;
int x;
int arr[];//有些编译器不支持这样写,可以写成int arr[0],这个就是柔性数组
}St;
int main()
{
//这里我们可以计算一下柔性数组到底计不计算空间
printf("%d", sizeof(St));//这里涉及结构体的位段后面再说
return 0;
}
我们看到结构体的大小是8,所以柔性数组是不占空间的
2 柔性数组怎么用
用动态内存开辟的方式用,我们来结合昨天的动态内存管理设计一下程序
typedef struct Stu
{
char y;
int x;
int arr[];//有些编译器不支持这样写,可以写成int arr[0],这个就是柔性数组
}St;
int main()
{
//这里我们可以计算一下柔性数组到底计不计算空间
printf("%d\n", sizeof(St));//这里涉及结构体的位段后面再说
St s = { 0 };
St* p = NULL;
p = &s;
p = (St*)malloc(sizeof(int) * 10+sizeof(St));
if (p == NULL)
return 0;
for (int i = 0; i < 10; i++)
{
p->arr[i] = i;
printf("%d ", p->arr[i]);
}
//如果后面要多开辟空间的话
p = (St*)realloc(p,sizeof(int) * 15 + sizeof(St));
for (int i = 10; i < 15; i++)
{
p->arr[i] = i;
printf("%d ", p->arr[i]);
}
free(p);
p = NULL;
return 0;
}
3 柔性数组的一种模拟实现(有缺陷,总的来说还是柔性数组好用)
因为柔性数组只需要释放一次堆区内存,并且柔性数组不占用结构体内存
typedef struct Stu
{
char y;
int x;
int* arr;
}St;
int main()
{
printf("%d\n", sizeof(St));//指针占用内存空间
//先给结构体开辟空间
St* p = (St*)malloc(sizeof(St));
//然后指针指向的空间开辟
p->arr = (int*)malloc(sizeof(int) * 10);
//判断是否为空
if (p == NULL || p->arr == NULL)
return 1;
//不为空继续下面的程序
p->x = 1;
p->y = 'w';
for (int i = 0; i < 10; i++)
{
p->arr[i] = i;
printf("%d ", p->arr[i]);
}
//用完后记得释放内存,先释放小的,再释放大的
//如果你先释放大的话,那么指针arr没有了,怎么找arr指向的那块空间呢?
free(p->arr);
free(p);
//然后置空
p->arr = NULL;
p = NULL;
return 0;
}
文章来源:https://blog.csdn.net/2301_79811170/article/details/134853549
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!