C语言中柔性数组的用法
来源:互联网 发布:安卓 日记软件 编辑:程序博客网 时间:2024/04/27 20:16
测试环境:vs2008
1. 前言
柔性数组是成员数为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;
char type;
short len;
char val[0];
} tlv_t;
柔性数组的作用是,当我们结构体紧接着分配一个大小不固定的内存空间的时候,柔性数组会自动指向那段内存,而且柔性数组本身不占任何的空间。在数据结构tlv里,用柔性数组恰到好处。当然,val也可以用void *指针来代替,只不过,指针变量本身也要分配一段内存空间,那么在实际使用过程中,tlv结构里面多出一个指针变量,且在内存上不连续。
2. 例子-看看内存的占用情况
#include <stdio.h>#include <string.h>#include <malloc.h>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
请按任意键继续. . .
test_t size = 4
请按任意键继续. . .
可见,多了柔性数组,两个结构总大小是一致的。
3. 例子-柔性数组的使用
#include <stdio.h>#include <string.h>#include <malloc.h>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
阅读全文
0 0
- C语言中柔性数组的用法
- C语言中柔性数组的学习
- C语言柔性数组
- C语言柔性数组
- c语言柔性数组
- C语言---柔性数组
- C语言的柔性数组运用解析
- C语言创建柔性数组
- C语言创建柔性数组
- C语言中的柔性数组
- C语言中的柔性数组
- C语言中的柔性数组
- C语言中的柔性数组
- C语言中你不知道的事——柔性数组
- C语言(柔性数组,零长数组)
- 【C语言】变长数组与柔性数组
- C语言中的柔性数组结构
- 深入浅出C语言中的柔性数组
- 安装ubuntu常见问题解决办法
- bzoj3436 小K的农场 差分约束系统
- 机器学习:利用NLTK进行简单文本分析
- 情感分析的学习资源
- 18. 编写函数:输入4个整数,找出其中最小的数。用函数的嵌套调用来处理。
- C语言中柔性数组的用法
- Linux Shell特殊字符和控制字符大全
- 诡异的楼梯
- 主题四 指针和数组(下)----27.数组参数和指针参数
- 格雷编码
- 锦标赛
- 深入浅出计算机系统运行原理
- navicat for mysql 显示中文乱码解决办法
- Android 图片选择器 GalleryFinal