欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

柔性数组总结 柔性数组总结

程序员文章站 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就可以把所有的内存也给释放掉。

第三个好处是:可以把需要操作的数据和结构体统一起来
第四个好处是:这样有利于访问速度.

连续的内存有益于提高访问速度,也有益于减少内存碎片。(其实,我个人觉得也没多高了,反正你跑不了
要用做偏移量的加法来寻址)

相关标签: C语言 指针