C语言有关数组的几点

时间:2022-05-17 04:44:33

动态大小数组


先来看一段代码:

int n = 3;
int a[n];
int i;
for(i=0;i<n;i++)
{
a[i]=i;
printf("%d\n",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\n",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长数组只能在结构体末尾。