动态大小数组
先来看一段代码:
int n = 3; int a[n]; int i; for(i=0;i<n;i++) { a[i]=i; printf("%d ",a[i]); }
我在声明数组a时,使用了一个变量n,这看起来似乎有问题,但是实际上C99中支持这种用法,gcc也支持这种用法,可以正常编译运行。这种用法实现了动态大小数组(运行时动态,一旦确定不再改变)。
另外,如果一个数组的大小需要根据某一输入N的大小来确定,那该怎么办呢?
#include <stdio.h> #include <stdlib.h> void main() { int n; int *a; int i; scanf("%d",&n); a = (int*)malloc(sizeof(int)*n); for(i=0;i<n;i++) { a[i]=i; printf("%d ",a[i]); } return; }
上面这段代码中,数组a的大小依赖输入n,因此先将a声明为一个指针,在确定n的大小之后,使用malloc来为a分配内存。注意:上面代码中我没有free掉这段内存,实际使用中malloc之后应该在不使用这段内存时free!
0长数组
最近几次看到类似这样的结构体:
typedef struct { int a; int b[0]; }A;
看到没,长度为0的数组!!!当然,这种奇怪的用法只在GNU C中合法,在很多很多GNU开源代码中都用到过这种用法。
那么,为啥要设置一个0长的数组呢?为啥不声明一个指针:int *b?
首先,来看看int *b时的情况。这种情况下,我们在分配内存时,必须分配两次;在释放内存时也必须显示为b释放一次,这样太麻烦。如果使用b[0],有哪些好处呢?我们可能使用下面的语句来分配内存:
A *cc = (A *)malloc(sizeof(A)+len);
因为0长数组b不占内存,因此我们可以通过变量len来把握分配内存的大小,进而实现长度可变的结构体。使用0长数组可以分配一段连续的内存,在释放时直接使用free(cc)一次性释放掉所有内存,简化了内存管理。但是,0长数组只能在结构体末尾。