设为首页 加入收藏

TOP

C语言中柔性数组的用法
2017-06-19 10:22:16 】 浏览:6189
Tags:言中 柔性 用法

测试环境: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;
柔性数组的作用是,当我们结构体紧接着分配一个大小不固定的内存空间的时候,柔性数组会自动指向那段内存,而且柔性数组本身不占任何的空间。在数据结构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

 
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇var const let三者之间的区别 下一篇c语言 指针转换为整数或者 整数转..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目