size为0的数组是GUN C支持的一个特性,这个特性可以用来模拟动态大小的数组,同时又避免了一些问题,所以还是比较有实际意义的一个小技巧。在网上参考了一些资料,大多数资料都是以结构体中包含一个大小为0的数组为例。我想这样可能是基于两点考虑:
- 因为动态大小是“模拟”出来的,所以不可避免要申请空间,那么对于申请空间而言,以一个结构体的形式来申请,是比较方便的;
- 容易与别的实现方法做对比,比如在结构体中放置一个指针来做对比。
这个小技巧的好处有几点:
- 数组大小为0,所以并不会占用内存空间;
- 申请的空间在结构体中的其他变量之后,且是连续空间,可以使用数组名[index]的方式访问;
- 在释放空间时,只需要释放结构体指针指,就可以全部释放。
下面是一个简单的演示如何使用。
#include <stdio.h>
#include <stdlib.h>
typedef struct _arrvarsize
{
int len;
char buf[0];
}vararr;
int main(int argc, char* argv[])
{
int a = sizeof(vararr);
int n = 0;
int i = 0;
vararr* vararrPtr;
printf("vararr size is %d\n",a);
printf("input the size:\n");
scanf("%d",&n);
vararrPtr = (vararr*)malloc(sizeof(vararr)+n);
vararrPtr->len=n;
for(i=0;i<n;i++)
{
vararrPtr->buf[i]=i+1;
}
printf("\n\nvararr info\n\n");
printf("vararr->len:\n");
printf("addr:\t%p -> value:\t%d\n",&(vararrPtr->len),vararrPtr->len);
printf("vararr->buf:\n");
for(i=0;i<n;i++)
{
printf("addr:\t%p -> value:\t%d\n",&(vararrPtr->buf[i]),vararrPtr->buf[i]);
}
return 0;
}
运行结果如下图。