请先思考以下问题:
第一个问题 :
在标准C语言中,没有长度为0的数组,但在 GNU C语言中,数组长度可以为0 ,这是GNU对C语言的扩展。
先对零长数组做个介绍:
零长数组 :也叫柔性数组(变长数组) :
对于编译器来说, 此时 长度为0的数组并不占用空间 , 因为数组名本身不占空间, 它只是一个偏移量, 数组名这个符号本身代表了一个不可修改的 地址常量 。
第二个问题 :
通常定义一个不定长数据包的缓冲区,有两种常用方法:
MAX_LENGTH
的数据缓冲区下面依次分析使用 定长包 、指针数据包和使用零长数组三种方式的不同。
假设我们要在网络中接收一个长度为1024
字节的数据,怎么定义数据缓冲区呢?
定义一个数据缓冲区结构体data_buf
,成员包含数据长度len
和数据内容data
:
struct data_buf{
int len;
char data[MAX_LENGTH];
}
数据内容放在data
数组中,数据最大长度限制为MAX_LENGTH
字节,以满足接收数据的需求。
考虑对齐, 那么数据结构的大小 >= sizeof(int) + sizeof(char) * MAX_LENGTH
但是,通常情况下,我们接收的数据不会达到最大长度,假设MAX_LENGTH
=2048
,那么接收1024字节内容,还有1024字节空间就浪费了。
当接收到数据时,使用malloc动态分配内存。一般来说, 我们会返回一个指向缓冲区数据结构 data_buf
的指针:
/// 开辟
if ((mbuffer = (struct data_buf *)malloc(sizeof(struct data_buf))) != NULL)
{
mbuffer- >len = CURR_LENGTH;//CURR_LENGTH为接收到的数据长度
memcpy(mbuffer- >data, "Hello World", CURR_LENGTH);
printf("%d, %sn", mbuffer- >len, mbuffer- >data);
}
/// 销毁
free(mbuffer);
mbuffer = NULL;
MAX_LENGTH
, 而实际使用过程中, 达到 MAX_LENGTH
长度的数据很少, 那么多数情况下, 缓冲区的大部分空间都是浪费掉的.全部0条评论
快来发表一下你的评论吧 !