typedef struct holder { struct holder *next; struct holder *prev; char buffer[ 0 ]; } holder;最后一行 char data[ 0 ] 作用是()
1. 方便管理内存缓冲区:如果用指针 char* 代替 char data[0] 来指向新开辟的空间,需要两次malloc也需要两次free。用char data[0],一次malloc即完成,方便管理缓冲区。
2. 减少内存碎片化:如果在struct尾部用指针*指向新开辟的buffer长度,struct本身相较buffer长度是很小的,即碎片化的内存。而用char data[0]指向新开辟的buffer,只需一次malloc,struct和buffer的空间是连续的。即减少了内存的碎片化。
3. 节省空间,相较用指针指向新开辟的str,data[0]是不占用内存的,而指针占用4字节。
在给定的代码中,char buffer[0]是一个灵活数组成员(flexible array member)。这是一种常见的C语言技巧,用于在结构体中创建一个可变长度的数组。
在这个结构体中,buffer被定义为一个长度为0的char数组。尽管长度为0,但它在结构体中的作用是为了占位,为后续的动态内存分配提供空间。
通常,在使用这种灵活数组成员的结构体时,程序员会在运行时动态分配内存,使得buffer可以根据实际需求分配所需的空间。这样,结构体可以根据需要存储不同长度的数据。
size_t data_length = 10; // 为buffer分配10个字节的空间 holder *h = malloc(sizeof(holder) + data_length);
通过灵活数组成员,可以根据需要动态分配更多的内存,然后将数据存储在buffer中。这样,buffer的长度可以根据实际情况进行调整。
需要注意的是,使用灵活数组成员需要谨慎处理内存分配和释放,以避免内存泄漏和访问越界等问题。
- By ChatGPT