首页 > 试题广场 >

对以下数据结构中data的处理方式描述正确的是()

[单选题]
对以下数据结构中data的处理方式描述正确的是()
struct Node
{
   int size;
   char data[0];
};
  • data将会被编译成一个char *类型指针
  • 全部描述都不正确
  • 编译器会认为这就是一个长度为0的数组,而且会支持对于数组data的越界访问
  • 编译器会默认将数组data的长度设置为1
看不懂char data[0];请去百度  柔性数组,它只能放在结构体末尾,是
申明一个长度为0的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名本身不占空间,它只是一个偏移量, 数组名这个符号本身代 表了一个不可修改的地址常量 (注意:数组名永远都不会是指针! ),但对于这个数组的大小,我们可以进行动态分配 请仔细理解后半部分,对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!
 对于0长数组的这个特点,很容易构造出变成结构体,如缓冲区,数据包等等:
注意:构造缓冲区就是方便管理内存缓冲区,减少内存碎片化,它的作用不是标志结构体结束,而是扩展
柔性数组是C99的扩展,简而言之就是一个在struct结构里的标识占位符(不占结构struct的空间)
发表于 2015-11-18 10:22:27 回复(11)
对于变长数组和变长结构体,这是在C99才加入标准的。
对于变长数组,举个例子就能解释了:
int main() {
    int n = 10;
    int arr[n];
}
对于变长结构体就比较复杂一点(也不算很复杂:))。很多人其实会有这种疑惑,就是为什么不用指针去代替变长结构体,比如:
structNode
{
   intsize;
   char*data;
};
就这个问题,我总结了一下用指针和用变长结构体的区别:
1.在位置方面:指针可以放在任何地方,但是变长结构体的变长部分一定要放在结构体的最后。
2.在内存占用方面:指针会占一个指针的大小的内存空间,但是变长数组是不占内存的,它只是一个占位符。
3.在内存布局方面:指针指向的内存和结构体的内存可以是不连续的,但是变长部分和结构体的内存必须是连续。
4.在内存释放方面:使用指针,就要先释放指针所指的内存在释放整个结构体的内存,否则会照成内存泄露。
但是使用变长结构体直接释放整个结构体的空间就可以了
5.一个限制:指针可以用在C++的类中,但是变长结构体就不可以了。因为有些编译器会将一些额外的信息放在类的最后,
比如vptr或者虚基类的内容,使用了变长的类,就会把这部分的值改变,这种行为是未定义的,谁也不知道会发生什么。
发表于 2016-03-30 22:51:12 回复(3)
柔性数组(Flexible Array)也叫伸缩性数组,也就是变长数组,反映了C语言对精炼代码的极致追求。
这种代码结构产生于对动态结构体的需求, 比如我们需要在结构体中存放一个动态长度的字符串时,就可以用柔性数组。
C99使用不完整类型来实现柔性数组,标准形式如下:

struct MyStruct

{

int a;

double b;

char c[]; // or char c[0]; 也可以用其他数据类型;

};

c不占用MyStruct的空间,只是作为一个符号地址存在,而且必须是结构体的最后一个成员。
参考链接:http://www.cnblogs.com/nchxmoon/p/3145480.html

发表于 2016-08-03 09:54:43 回复(2)

在实际的编程中,我们经常需要使用变长数组,但是C语言并不支持变长的数组。此时,我们可以使用结构体的方法实现C语言变长数组。

struct MyData { int nLen; char data[0];}; 
在结构中,data是一个数组名;但该数组没有元素;该数组的真实地址紧随结构体MyData之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容);这种声明方法可以巧妙的实现C语言里的数组扩展。 
实际用时采取这样: 
struct MyData *p = (struct MyData *)malloc(sizeof(struct MyData )+strlen(str))

这样就可以通过p->data 来操作这个str。

发表于 2020-02-19 11:39:20 回复(1)
数组名和指针有明显区别 只有在函数调用的时候 数组名才会退化为指针
发表于 2022-03-04 00:42:07 回复(0)
data(0)是柔性数组,数组名是一个指针常量,不占据地址内存。
发表于 2022-01-13 00:10:10 回复(0)

编译器并不会对data 分配空间,当数据超过结构体可存范围后,可通过操作data获取超出的数据

发表于 2019-10-26 14:46:49 回复(0)

1、什么是柔性数组?

柔性数组既数组大小待定的数组, C语言中结构体的最后一个元素可以是大小未知的数组,也就是所谓的0长度,所以我们可以用结构体来创建柔性数组。

2、柔性数组有什么用途 ?

它的主要用途是为了满足需要变长度的结构体,为了解决使用数组时内存的冗余和数组的越界问题。

3、用法 :在一个结构体的最后 ,申明一个长度为空的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名

本身不占空间,它只是一个偏移量, 数组名这个符号本身代 表了一个不可修改的地址常量 (注意:数组名永远都不会是指针! ),但对于这个数组的大小,我们

可以进行动态分配,对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!

对于柔性数组的这个特点,很容易构造出变成结构体,如缓冲区,数据包等等:

发表于 2018-06-05 10:36:24 回复(0)
柔性数组,它只能放在结构体末尾
发表于 2023-03-14 11:48:48 回复(0)
typedef struct MyStruct
{ int a; double b; char c[];
} ms,*pms; int main()
{ char c1[] = "Short string."; char c2[] = "This is a long string.";

    pms pms1 = (pms)malloc( sizeof(ms) + strlen(c1) + 1 ); if( NULL != pms1 )
    {
        pms1->a = 1;
        pms1->b = 11;
        strcpy(pms1->c, c1);
    }
发表于 2021-07-01 16:53:50 回复(0)

data(0)称为柔性数组,数组的数组名是一个指针常量,常量不占据地址内存。



发表于 2020-03-03 13:15:02 回复(0)
数组和指针有明显的区别,只有在函数调用时,才会退化为指针
发表于 2020-02-10 09:39:04 回复(0)
int a[0],编译器会认为这就是一个长度为0的数组,而且会支持对于数组data的越界访问
编辑于 2019-02-08 13:24:48 回复(0)
看不懂char data[0];请去百度  柔性数组,它只能放在结构体末尾,是 申明一个长度为0的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名本身不占空间,它只是一个偏移量, 数组名这个符号本身代 表了一个不可修改的地址常量 (注意:数组名永远都不会是指针! ),但对于这个数组的大小,我们可以进行动态分配 请仔细理解后半部分,对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!  对于0长数组的这个特点,很容易构造出变成结构体,如缓冲区,数据包等等: 注意:构造缓冲区就是方便管理内存缓冲区,减少内存碎片化,它的作用不是标志结构体结束,而是扩展 柔性数组是C99的扩展,简而言之就是一个在struct结构里的标识占位符(不占结构struct的空间)
发表于 2018-12-02 09:26:43 回复(0)
柔性数组,作为占位符放在结构体末尾,使得结构体的大小动态可变,在声明结构体变量的时候可根据需要动态分配内存。
发表于 2018-03-13 11:12:33 回复(0)
char data[0];柔性数组,放在结构体末尾,是 申明一个长度为0的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名本身不占空间!
发表于 2017-08-29 10:08:17 回复(0)
柔性数组,作为占位符放在结构体末尾,使得结构体的大小动态可变,在声明结构体变量的时候可根据需要动态分配内存。

发表于 2017-05-22 11:19:01 回复(0)
看不懂char data[0];请去百度  柔性数组,它只能放在结构体末尾,是
申明一个长度为0的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名本身不占空间,它只是一个偏移量, 数组名这个符号本身代 表了一个不可修改的地址常量 (注意:数组名永远都不会是指针! ),但对于这个数组的大小,我们可以进行动态分配 请仔细理解后半部分,对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!
 对于0长数组的这个特点,很容易构造出变成结构体,如缓冲区,数据包等等:
注意:构造缓冲区就是方便管理内存缓冲区,减少内存碎片化,它的作用不是标志结构体结束,而是扩展
柔性数组是C99的扩展,简而言之就是一个在struct结构里的标识占位符(不占结构struct的空间)
发表于 2017-05-14 00:40:08 回复(0)
柔性数组,为了追求可拓展性。
发表于 2017-01-10 12:13:56 回复(0)
这个是柔性数组
发表于 2016-12-25 13:34:47 回复(0)