C语言中柔性数组的用法
程序员文章站
2022-06-24 20:31:57
测试环境:vs2008
1. 前言
柔性数组是成员数为0的数组,单独并不可用。如果强行定义一个,编译器会报错。譬如,定义 int a[0];编译后会出现错误:error C24...
测试环境:vs2008
1. 前言
tlv val: tlv test val
柔性数组是成员数为0的数组,单独并不可用。如果强行定义一个,编译器会报错。譬如,定义 int a[0];编译后会出现错误:error C2466: cannot allocate an array of constant size 0。
上面错误的意思是不能够分配一个长度为零的数组。
柔性数组只能做为结构体的最后一个成员,例如:
typedef struct __tlv {
char type;
short len;
char val[0];
} tlv_t;
柔性数组的作用是,当我们结构体紧接着分配一个大小不固定的内存空间的时候,柔性数组会自动指向那段内存,而且柔性数组本身不占任何的空间。在数据结构tlv里,用柔性数组恰到好处。当然,val也可以用void *指针来代替,只不过,指针变量本身也要分配一段内存空间,那么在实际使用过程中,tlv结构里面多出一个指针变量,且在内存上不连续。
2. 例子-看看内存的占用情况
#include #include #include typedef struct __tlv { char type; short len; char val[0]; } tlv_t; typedef struct { char type; short len; } test_t; int main() { printf("tlv_t size = %lu\n", sizeof(tlv_t)); printf("test_t size = %lu\n", sizeof(test_t)); return 0; }编译后,运行:
tlv_t size = 4
test_t size = 4
请按任意键继续. . .
可见,多了柔性数组,两个结构总大小是一致的。
3. 例子-柔性数组的使用
#include #include #include typedef struct __tlv { char type; short len; char val[0]; } tlv_t; #define TLV_V "tlv test val" int main() { tlv_t *msg = (tlv_t *)calloc(sizeof(tlv_t) + strlen(TLV_V) + 1, 1); msg->type = 1; msg->len = strlen(TLV_V) + 1; // 加1是因为,结束符'\0'占一个字节。 memcpy(msg->val, TLV_V, strlen(TLV_V)); printf("tlv val: %s\n", msg->val); free(msg); msg = NULL; return 0; }编译运行:
tlv val: tlv test val