首页 > 试题广场 >

C代码中可能会出现如下类型的结构体定义: typedef

[不定项选择题]
C代码中可能会出现如下类型的结构体定义:
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字节。

发表于 2020-08-09 23:56:56 回复(0)
一、在struct结构定义的后面使用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.节省空间(这里就不得不说说指针和data[0]的区别)

二、使用指针和data[0]有一下区别:
1.地址的连续性,data[0]和结构体是一个连续的存储空间,使用指针就不是连续的。连续的存储空间通过不同的强转使用起来比较灵活。
2.data[0]不占用任何内存,*data占用4字节 。
3.建议:C++的类中可以使用 *data但是不要使用data[0],因为这样使用可能会导致类中的一些看不到的东西被覆盖。
发表于 2021-11-09 19:52:07 回复(1)
在结构体定义最后一行使用 char data[ 0 ] 
在结构体中,data是一个数组名,但该数组没有元素。该数组的真实地址紧随结构体之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容)。这种声明方法可以巧妙的实现C语言里的数组扩展。
这种声明方法的作用如下:
1.方便管理内存缓冲区:用指针需要两次malloc和free用char data[0],只需一次malloc和free,方便管理缓冲区
2.减少内存碎片化:用指针指向开辟的buffer与结构体不连续,用char data[0]指向开辟的buffer,struct和buffer的空间是连续的。即减少了内存的碎片化。
3.节省空间:指向开辟的buffer,指针占4字节(32位系统),而data[0]是不占用内存的。
编辑于 2022-02-19 00:25:07 回复(0)

在给定的代码中,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

发表于 2023-07-20 09:39:07 回复(0)