首页 > 试题广场 >

定义网络传输数据包为以下结构体,其中data的作用是什么?

[单选题]
定义网络传输数据包为
class packet{
     int size;
     void data[0];
}
其中data的作用是?
  • 维护数据包空间的连续性
  • 数据分割位
  • 指向独立的数据空间
  • 无任何作用
推荐
1.data[0]表示柔性数组,是为了减少内存碎片保持属于连续性,连续的地址并非是独立的地址空间
2.该数组的内存地址就和它后面的元素地址相同,意味着无需初始化,数组名就是后面元素的地址,直接就能当指针使用。例如,制作动态buffer,可以这样分配空间malloc(sizeof(structXXX) + buff_len); 直接就把buffer的结构体和缓冲区一块分配了。这样使用释放一次即可,如果使用指针,则需要释放两次。
3. 考虑到可移植性的原因, 可以写成data[1]或data[],因为有些编译器不支持0数组。

最终的答案选A

编辑于 2016-12-07 11:33:43 回复(0)
http://blog.csdn.net/yby4769250/article/details/7294696
这篇文章写得很清楚,简单来说就是添加一个可变的数组
发表于 2015-11-17 12:34:08 回复(1)
柔性数组,减少内存碎片化,维护数据包空间的连续性。
发表于 2017-01-17 17:33:45 回复(0)
将以下两种形式进行比较
class packet{
     int size;
     void data[0];
}
class packet{
     int size;
     char *data;
}
前者如果需要长度为8的缓冲区,前者只需要分配一个长度为12内存,且是连续的
而后者要分配两次内存,第一次是给类分配一次类型,第二次是分配一个长度为8的内存,让指针data指向该内存
发表于 2019-02-01 15:54:35 回复(0)
我觉得这个题应该选A,因为无法为里面的弹性数组分配特定的空间,只能对整体进行内存分配。
http://blog.csdn.net/vonzhoufz/article/details/32125207

发表于 2015-04-08 16:40:15 回复(8)

举个栗子:

class Packet {

public:

int size;

char data[0];//vs不允许定义void数组

};

int main () {

Packet* a = (Packet*)malloc(sizeof(Packet

) +100*sizeof(char));

a->dada[0] = ‘a’;

a->data[99] = ‘b’;

return 0;

}

使用这样的定义可以动态分配所需的空间,并和类本身的数据保持连续。



发表于 2019-11-08 09:01:24 回复(0)
长度为0的数组的主要用途是为了满足需要变长度的结构体。此处要考虑到数组中边界对齐要求,若data声明成void类型,则data可以转换成任意类型,且data中的成员类型都相同,这就满足了边界对齐,则不会出现内存碎片的问题,从而保证了数据包空间的连续性
编辑于 2018-06-07 10:45:01 回复(0)
柔性数组,减少内存碎片化,维护数据包空间的连续性。
发表于 2018-02-03 09:43:17 回复(0)
感觉就是知道了前面的地址,然后后面直接在前面的基础加多少多少,虽然没有具体的变量名字取表示它,但可以通过它前面的变量去找到它
发表于 2016-09-12 21:52:10 回复(0)
data由于是数组名,所以在使用的时候相当于一个指针,但是否是指向一个独立的空间就看怎么实现了,如果实现时后面跟了一个数组,那么就没有指向一个独立的空间,而是指向了一个与size相连的空间
发表于 2016-05-30 23:25:28 回复(0)
网络方面用的多是吗?!
发表于 2016-05-17 16:53:29 回复(0)
我姑且这么理解着……就是data[]的另一种非通用写法吧
发表于 2016-02-25 01:26:51 回复(0)
不懂
发表于 2015-07-22 22:29:14 回复(0)
感觉应该选A,因为data不存任何数据,但它会占用1字节的空间
发表于 2015-04-10 15:10:49 回复(1)
不懂。请高手进!解释下~
发表于 2015-04-01 17:46:54 回复(1)