转载请加注:Qdieyou
定义一个结构体如下:
typedef struct buffer_s {
int a;
int buffer_no;
int flags;
unsigned char data[0];
} buffer_t;
大家注意到最后那个长度为0的字符数组了吧?不知道你疑惑了没。嘿嘿!!!
这个常用技巧常用来构成缓冲区:
数组名就代表了该结构体后面数据的起始地址(而且无需初始化,不占空间) 而如果用指针的话,我们还要初始化,而且还要占空间(好象是int类型长度的空间)
见程序代码如下:
buffer_t *buf;
int buf_len /*缓冲区数据的长度*/
/*直接把buffer的结构体跟存放数据的内存一起分配了*/
buf = (buffer_t *) malloc( sizeof(buffer_t) + buf_len);
buf->data = "我就是缓冲中的内容/n";
/*也可以下面这样引用:*/
buf->data = 'a'; /*i的取值范围:0~buf_len-1*/
怎么样?明白几分了?
在结构体中,我们定义了0长度的数组,按理buf->data = 'a';属于越界访问,但是我们把结构体后面的buf_len个长度的空间也一起申请了,所以该访问是合法的!
定义一个结构体如下:
typedef struct buffer_s {
int a;
int buffer_no;
int flags;
unsigned char data[0];
} buffer_t;
大家注意到最后那个长度为0的字符数组了吧?不知道你疑惑了没。嘿嘿!!!
这个常用技巧常用来构成缓冲区:
数组名就代表了该结构体后面数据的起始地址(而且无需初始化,不占空间) 而如果用指针的话,我们还要初始化,而且还要占空间(好象是int类型长度的空间)
见程序代码如下:
buffer_t *buf;
int buf_len /*缓冲区数据的长度*/
/*直接把buffer的结构体跟存放数据的内存一起分配了*/
buf = (buffer_t *) malloc( sizeof(buffer_t) + buf_len);
buf->data = "我就是缓冲中的内容/n";
/*也可以下面这样引用:*/
buf->data = 'a'; /*i的取值范围:0~buf_len-1*/
怎么样?明白几分了?
在结构体中,我们定义了0长度的数组,按理buf->data = 'a';属于越界访问,但是我们把结构体后面的buf_len个长度的空间也一起申请了,所以该访问是合法的!