浅析长度为0的数组
来源:互联网 发布:知乎for mac 编辑:程序博客网 时间:2024/05/17 15:56
前面在看Xen的源码时,遇到了一段代码,如下所示:
注意上面最后一行的代码,这里定义了一个长度为的数组,这种用法可以吗?为什么可以使用长度为0 的数组?长度为的数组到底怎么使用?……这篇文章主要针对该问题进行简单的讲解。废话不多说了,现在就开始。
长度为的数组在标准c和c++中是不允许的,如果使用长度为的数组,编译时会产生错误,提示数组长度不能为。但在GNUc中,这种用法却是合法的。它的最典型的用法就是位于数组中的最后一项,如上面所示,这样做主要是为了方便内存缓冲区的管理。如果你将上面的长度为的数组换为指针,那么在分配内存时,需采用两步:首先,需为结构体分配一块内存空间;其次再为结构体中的成员变量分配内存空间。这样两次分配的内存是不连续的,需要分别对其进行管理。当使用长度为的数组时,则是采用一次分配的原则,一次性将所需的内存全部分配给它。相反,释放时也是一样的。
对于长度为的数组,在gcc手册中,有如下一段代码片段:
struct line {
int length;
char contents[0];
};
struct line thisline = (struct line )malloc (sizeof (struct line) + this_length);
thisline->length = this_length;
这段代码的主要含义是定义了一个结构体,并对其进行初始化,上面结构体的第二个成员变量contents[0]事实上是不占内存空间的,因此整个结构体的长度sizeof(struct line)为4。当采用malloc为其申请内存空间时,如上所示,申请了一段长度为结构体长度加可变长度的内存空间给结构体类型的指针,这时contents就指向申请的可变长度的内存空间。由于是一次申请的,所以这段可变长度的内存空间和前面的结构体长度的内存空间是连续的。对于这段可变长度的内存空间,可以采用数组的方式对其进行访问。对于整个结构体,当不再使用时,可以使用free函数一次性对其进行释放,而不必像指针那样分别释放。
下面举例进行说明:
include
include
define LENGTH 10
struct test1
{
int a;
int *b;
}__attribute((packed));
struct test2
{
int a;
int b[0];
}__attribute((packed));
struct test3
{
int a;
int b[1];
}__attribute((packed));
int main()
{
struct test1 *var1;
struct test2 *var2;
struct test3 *var3;
int i;
printf(“the length of struct test1:%d\n”,sizeof(struct test1));
printf(“the length of struct test2:%d\n”,sizeof(struct test2));
printf(“the length of struct test3:%d\n”,sizeof(struct test3));
var1=(struct test1*)malloc(sizeof(struct test1));
var1->a=1;
var1->b=(int *)malloc(sizeof(int));
*var1->b=1;
printf(“\nvar1->a=%d,*(var1->b)=%d\n”,var1->a,*var1->b);
var2=(struct test2*)malloc(sizeof(struct test2)+sizeof(int)*LENGTH);
var2->a=2;
printf(“\nvar2->a=%d\n”,var2->a);
for(i=0;i
- 浅析长度为0的数组
- 长度为0的数组
- 长度为0的数组
- 长度为0数组
- 数组长度为0和数组为null的区别
- 长度为0的动态数组
- C语言长度为0的数组
- php 长度为0的数组
- 长度为0的数组和 null
- 柔性数组成员 长度为0的数组
- C语言长度为0的数组的使用
- 长度为0的字符数组的赋值
- c语言中长度为0的数组妙用
- C语言中长度为0的数组
- struct中长度为0的数组用途与原理
- C语言中长度为0的数组 .
- 用长度为0的数组管理共享内存
- C语言中长度为0的数组
- Android studio 设置
- Windows 7安装解压版MySQL 5.6(不包含配置文件优化)
- 外部排序算法整理
- Cannot cast from Fragment to NewsContentFragment
- 获取自己的经纬度 LocationManager
- 浅析长度为0的数组
- 单词统计(哎呦我去!)
- node 编译遇到 Exit status 137问题解决
- mac下文件带有扩展属性的问题
- Android的资源类型之Drawable
- mac ionic 安装
- 一分钟带你理解闭包--js面向对象编程
- 【java学习】正则表达式的应用
- 由首例无人驾驶车祸谈起:机器视觉的盲区