C/C++ 中长度为0的数组
参考文献:http://blog.csdn.net/zhaqiwen/article/details/7904515
近日在看项目中的框架代码时,发现了了一个奇特的语法:长度为0的数组例如
uint8_t buf[];
我从未见过这样的写法,所以在网上查了查资料,了解并记录下来.
在标准的C/C++中,长度为0的数组是不被允许的,它算是一个C/C++扩展,如果你的编译器支持这个扩展,你就可以使用它.
VS系列编译器不完全支持这个扩展,如果你这样定义,多半会在编译时出现这样的警告:warning C4200: 使用了非标准扩展 : 结构/联合中的零大小数组,当 UDT 包含大小为零的数组时,无法生成复制构造函数或副本赋值运算符
GUN编译器完全支持这个扩展,你可以合法的声明长度为0的数组,但这种声明的最典型的用法就是位于数组中的最后一项,为了方便内存缓冲区的管理,例如:
struct Line{
uint32_t length;
char contents[];
};
在结构体中,长度为0的数组不会占用存储空间 ,在上述例子中 sizeof(Line)=4
在申请内存空间时,缓冲区的空间可以和结构体的空间一起申请,一次操作就可以完成.例如
uint32_t length = ;
struct Line *pLine = (struct Line *)malloc(sizeof (struct Line) + length);
pLine->length = length;
上述代码就动态地为结构体申请了长度(length)为10byte的缓冲区,而且由于是同一次malloc操作,缓冲区与结构体的内存地址是连续的,而且可以按照数组下标访问缓冲区元素,例如
for(uint32_t i = ;i < pLine->length;++i)
{
pLine->contents[i] = i;
}
由于缓冲区与结构体的内存地址是连续的,在释放内存的时候,只需要一次free操作.
综上所述,比起在结构体中定义一个指针指向另一片缓冲区地址的做法,使用长度为0的数组有以下好处:
1->指针本身需要占用内存,而长度为0的数组不需要
2->长度为0的数组定义出的缓冲区可以和结构体处在同一片连续地址中,只要一次malloc操作和free操作.如果用指针,需要分别申请和释放结构体内存和指针指向的内存块,至少需要两次以上的内存操作.
测试代码:
编译器: gcc version 4.8.1 (tdm-2)
#include <stdio.h>
#include <stdint.h>
#include <malloc.h>
struct Line{
uint32_t length;
uint8_t contents[];
};
int32_t main()
{
uint32_t length = , i;
printf("sizeof(Line)=%d\n", sizeof(struct Line));
struct Line *pLine = (struct Line *)malloc(sizeof (struct Line) + length);
pLine->length = length;
for (i = ; i < pLine->length; ++i)
{
pLine->contents[i] = i;
}
for (i = ; i < pLine->length; ++i)
{
printf("i=%d,contents[i]=%d\n", i, pLine->contents[i]);
}
//free(pLine);
return ;
}
成功执行并打印结果:
sizeof(Line)=
i=,contents[i]=
i=,contents[i]=
i=,contents[i]=
i=,contents[i]=
i=,contents[i]=
i=,contents[i]=
i=,contents[i]=
i=,contents[i]=
i=,contents[i]=
i=,contents[i]=
Press any key to continue . . .
在VS2013中编译运行上述代码,除了会报警告 " warning C4200 " 外,程序也可以正确运行.
C/C++ 中长度为0的数组的更多相关文章
- (转)C语言中长度为0的数组
前面在看Xen的源码时,遇到了一段代码,如下所示: 注意上面最后一行的代码,这里定义了一个长度为的数组,这种用法可以吗?为什么可以使用长度为0 的数组?长度为的数组到底怎么使用?……这篇文章主要针对该 ...
- struct中长度为0的数组用途与原理
前言 在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNUC中,存在一个非常奇怪的用法,那就是长度为0的数组,比如Array[0]; 很多人可能觉得不可思议,长度为0的数组是没有什么意义的, ...
- Java中长度为0的数组与null的区别
有如下两个变量定义,这两种定义有什么区别呢? 1. int[] zero = new int[0]; 2. int[] nil = null; zero是一个长度为0的数组,我们称之为“空数组”,空数 ...
- <转>浅析长度为0的数组
前面在看Xen的源码时,遇到了一段代码,如下所示: 注意上面最后一行的代码,这里定义了一个长度为的数组,这种用法可以吗?为什么可以使用长度为0 的数组?长度为的数组到底怎么使用?……这篇文章主要针对该 ...
- c++ new长度为0的数组
在程序中发现一下代码: int CHmcVideoMgt ::OnGetDiskRunningInfo( SOCKETPARAM *pSocketInfo ,Json:: Value Param ) ...
- GNU C的定义长度为0的数组
在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNU C中,存在一个非常奇怪的用法,那就是长度为0的数组,比如Array[0];很多人可能觉得不可思议,长度为0的数组是没有什么意义的,不过在 ...
- C++ new 长度为0的数组
在C++中可以new一个长度为0的数组,通过下面的语句: char* p = new char[0]; 指针p中保存一个非NULL的地址,但是你不能够对p指向的内存进行写入,因为p的内存长度为0, 该 ...
- 【C语言高级编程】你见过长度为0的数组吗?管你信不信,看就完了!
一.什么是零长度数组 零长度数组就是长度为0的数组. ANSI C 标准规定:定义一个数组时,数组的长度必须是一个常数,即数组的长度在编译的时候是确定的.在ANSI C 中定义一个数组的方法如下: 类 ...
- Oracle中长度为0字符串与null等价
不试不知道,Oracle中,长度为0的字符串'' 居然与null等价! 众所周知,null代表空,什么都不存在,而一个字符串'',虽然长度为0,但毕竟已经是一个字符串,二者怎么能等价,混为一谈呢. 在 ...
随机推荐
- Let the Balloon Rise
Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...
- 贪心 BestCoder Round #39 1001 Delete
题目传送门 /* 贪心水题:找出出现次数>1的次数和res,如果要减去的比res小,那么总的不同的数字tot不会少: 否则再在tot里减去多余的即为答案 用set容器也可以做,思路一样 */ # ...
- TODO:C# Socket
http://www.cnblogs.com/licongjie/archive/2006/10/26/540640.html http://blog.csdn.net/ZOU_SEAFARER/ar ...
- Assets/Sciprts/GameSciprt.js(97,46): BCE0044: expecting :, found ','.
function BuildDeck() { var totalRobots:int=4; var card:Object; var i:int; for(i=0;i<totalRobots;i ...
- android 屏幕截取,pull到pc端
1.当需要截取手机屏幕时,进行批命令点击,截取adb pull到电脑端,或者进行接口上传到服务器. GetScreen.bat @ECHO OFF :: read config.cfg SETLOCA ...
- 【BZOJ】1189: [HNOI2007]紧急疏散evacuate(二分+bfs+网络流)
http://www.lydsy.com/JudgeOnline/problem.php?id=1189 表示完全不会QAQ.... 于是膜拜题解orz 二分时间........... 于是转换成判定 ...
- redis API使用说明
List相关: LPOP key : 删除并取得LIST头部一个元素 RPOP key : 删除并取得LIST尾部一个元素 BLPOP key [key ...] timeout : 删除并取得LIS ...
- 一致性 hash 算法
consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在 cache 系统中应用越来越广泛: 1 ...
- sum()over()和count()over()分析函数
创建测试表 ),sales ),dest ),dept ),revenue number); 插入测试数据 ); ); ); ); ); ); ); commit; 查看表记录 SQL> sel ...
- 李洪强-C语言3-数组
一.数组的概念 用来存储一组数据的构造数据类型 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素. 二.数组的定义 格式: 类型 数组名[元素个数]: 举例:存 ...