柔性数组总结 柔性数组总结
程序员文章站
2022-07-13 23:25:48
...
柔性数组
C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。
柔性数组的定义
typedef struct Test
{
int a;
double b;
int c;
char ch[0]; //柔性数组
}Test;
柔性数组的特点及如何使用
1、结构中的柔性数组成员前面必须至少一个其他成员。
2、sizeof 返回的这种结构大小不包括柔性数组的内存。
3、包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应
柔性数组的预期大小
第一点我们很容易理解,现在演示第二和第三点
如果柔性数组占空间的话,sizeof(Test)的大小应该为32,(计算结构体大小博主有写过),但柔性数组本身不占空间,所以结构体只开辟了24字节的大小空间。
代码一
typedef struct Test
{
int a;
double b;
int c;
int d;
char ch[0];
}Test;
int main()
{
char str[] = "hello world";
Test *pt = (Test*)malloc(sizeof(Test) + strlen(str) + 1);
if (NULL == pt)
{
printf("Insufficient memory available\n");//没有足够的空间
return;
}
strcpy(pt->ch, str);
printf("str = %s\n", pt->ch);
free(pt);
pt = NULL;
return 0;
}
代码二
typedef struct Test
{
int a;
double b;
int c;
int d;
char *ch;
}Test;
int main()
{
char str[] = "hello world";
Test *pt = (Test*)malloc(sizeof(Test));
if (NULL == pt)
{
printf("Insufficient memory available\n");//没有足够的空间
return;
}
pt->ch = (char*)malloc(strlen(str) + 1);
if (NULL == pt->ch)
{
printf("Insufficient memory available\n");//没有足够的空间
return;
}
strcpy(pt->ch, str);
printf("str = %s\n", pt->ch);
free(pt->ch);
pt->ch = NULL;
free(pt);
pt = NULL;
return 0;
}
代码1 和 代码2 可以完成同样的功能,但是 方法1 的实现有两个好处:
第一个好处是:不占内存空间
第二个好处是:方便内存释放
如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给用户。用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。
第三个好处是:可以把需要操作的数据和结构体统一起来
第四个好处是:这样有利于访问速度.
连续的内存有益于提高访问速度,也有益于减少内存碎片。(其实,我个人觉得也没多高了,反正你跑不了
要用做偏移量的加法来寻址)