首页 > 试题广场 >

最后一行char data[0];的作用是?

[不定项选择题]
开发C代码时,经常见到如下类型的结构体定义:
typedef struct list_t{
struct list_t *next;
struct list_t *prev;
char data[0];
}list_t;
最后一行char data[0];的作用是?
  • 方便管理内存缓冲区
  • 减少内存碎片化
  • 标识结构体结束
  • 没有作用
推荐
答案是AB
           看不懂char data[0];请去百度  柔性数组,它只能放在结构体末尾,是
申明一个长度为0的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名本身不占空间,它只是一个偏移量, 数组名这个符号本身代 表了一个不可修改的地址常量 (注意:数组名永远都不会是指针! ),但对于这个数组的大小,我们可以进行动态分配 请仔细理解后半部分,对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!
 对于0长数组的这个特点,很容易构造出变成结构体,如缓冲区,数据包等等:
注意:构造缓冲区就是方便管理内存缓冲区,减少内存碎片化,它的作用不是标志结构体结束,而是扩展
柔性数组是C99的扩展,简而言之就是一个在struct结构里的标识占位符(不占结构struct的空间)。
编辑于 2015-11-15 08:28:03 回复(7)
struct MyData
{
int nLen;
char data[0];
};   
在结构中,data是一个数组名;但该数组没有元素;该数组的真实地址紧随结构体MyData之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容);这种声明方法可以巧妙的实现C语言里的数组扩展。
编辑于 2016-06-02 08:59:28 回复(0)
这样整体形成一个数据包,好处是char data[0]不占用空间,而且形成一个整体,
访问时依靠数组下标溢出的特性,p->data[size],在早期有些技术牛人都爱这样写,
不过在今天这是一种不安全的写法,不推荐,而且现在的编译器也比较严格,一般通不过编译了。
发表于 2016-05-26 20:12:32 回复(3)
Struct test{ 
     int a; 
     char c[0]; 
}Test;
  1. char c[0]为长度为0的数组,是一个偏移量,不占空间。
  2. 如果没有额外的数据,则为结构体指针分配空间是  Test *p = (Test *)malloc(sizeof(Test));
  3. 如果有额外1024个字符数据要传递,则为结构体指针分配空间是 Test *p = (Test *)malloc(sizeof(Test)+1024*sizeof(char));
所以如果定义结构体时,为了保证c数组能足够容纳下数据,定义了非常大的空间大小,如char c[1024],但在实际使用中,多数数据不能充分使用c[1024]的空间,导致内存产生大量的碎片。采用c[0]的定义方式,给了结构体足够的缓冲空间以根据实际数据的大小动态调整结构体指针指向内存地址的大小。
发表于 2017-03-17 15:01:28 回复(0)
柔性数组!方便!把结构体变得可以变长,而不至于引用一个不知道在哪的内存,使得内存碎片化,所以很方便啊,他不能标示结束,因为他自己有内存的话,结束点=他自己的指针+自己的长度,所以C错误
发表于 2016-11-14 19:06:22 回复(0)
char data[0]为柔性数组,代表结构体是可变长度的。
发表于 2016-09-09 12:04:30 回复(0)

答案:A、B。

柔性数组是C99的扩展,简而言之,就是一个在struct结构里的标识占位符
(不占结构struct的空间)。主要有以下两点用途:

1)满足需要变长度的结构体。

2)使这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,
因为数组名本身不占空间,它只是一个偏移量,
数组名这个符号本身代表了一个不可修改的地址常量(注意:数组名永远都不会是指针!),
但对于这个数组的大小,就可以进行动态分配。

所以,选项A与选项B正确。

发表于 2018-07-07 16:23:38 回复(0)
用法如下:

#include <string.h>
#include <stdlib.h>

struct mydata{
    int a;
    char data[0];
};

int main(void) {
    char *s = "1234";
    struct mydata *da = (struct mydata *)malloc(sizeof(struct mydata)+strlen(s)+1);
    memcpy(da->data,s,strlen(s)+1);
    printf("%s\n",da->data);
    free(da);
    return 0;
}

发表于 2020-03-19 22:44:27 回复(0)
柔性数组的概念具体可以参考http://www.cnblogs.com/nchxmoon/p/3145480.html
柔性数组:把一个元组的数组放在一个struct的尾端,于是每个struct对象可以拥有可变大小的数组。
struct mumble *pmumbl=(struct mumble*)malloc(sizeof(struct(mumble)))+strlen(string)+1;
    strcpy(pmumbl->pc,string);
柔性数组也叫伸缩性数组,就是变长数组,它不占用结构体的空间,只是作为一个符号地址存在。并且必须是结构体的最后一个成员。

首先对0长数组做一个解释:

用途 :长度为0的数组的主要用途是为了满足需要变长度的结构体。

用法 :在一个结构体的最后 ,申明一个长度为0的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名本身不占空间,它只是一个偏移量, 数组名这个符号本身代 表了一个不可修改的地址常量 (注意:数组名永远都不会是指针! ),但对于这个数组的大小,我们可以进行动态分配!对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!

发表于 2017-08-23 09:12:57 回复(0)
本来打字打了很多,结果我2G内存的电脑崩溃了,重启后都没了,哎,大家自己补一下这个吧,: https://blog.csdn.net/tjcwt2011/article/details/80824505 

发表于 2020-04-30 13:19:13 回复(0)
list_t l;
char *pc = reinterpret_cast<char *>(&l + 1);
为什么不能用这个data作为结构体的结束标志呢???
发表于 2017-02-14 14:18:40 回复(0)
char data[0]柔性数组,只能放在struct末尾,表示该struct是可变长度的,多余的容量分配给data数组,实现可变长度的数组
编辑于 2016-10-03 21:46:36 回复(0)