C 的新手。我正在编写一个 ANSI C 程序(在 Linux 上使用 gcc 4.4.6)并且需要知道如何初始化一个数值数组,例如 int 或 double,其中数组的长度在程序运行时确定跑?
ANSI C 是否允许一个人声明变量,执行一些代码(其中长度是确定的),然后声明其他变量(例如有问题的数组)?
如果没有,这在实践中是如何完成的?gcc -ansi ...
注意程序使用switch编译。
C 的新手。我正在编写一个 ANSI C 程序(在 Linux 上使用 gcc 4.4.6)并且需要知道如何初始化一个数值数组,例如 int 或 double,其中数组的长度在程序运行时确定跑?
ANSI C 是否允许一个人声明变量,执行一些代码(其中长度是确定的),然后声明其他变量(例如有问题的数组)?
如果没有,这在实践中是如何完成的?gcc -ansi ...
注意程序使用switch编译。
要创建动态数组,您可以使用指针;用法几乎相同,但是完成后您需要 free() 内存;
int staticArray[10];
int *dynamicArray;
// calculate length of the dynamic array here
int length = 3*4;
dynamicArray = (int*)malloc(length * sizeof(int));
staticArray[4] = 7;
dynamicArray[8] = 5;
free(dynamicArray);
如果您希望在堆栈上分配数据(并且如果它可用),我会建议您alloca
结束,但 malloc 在大多数情况下都可以工作。malloc
请注意,即使使用 GCC 编译,GCC 也允许使用灵活长度的数组,-ansi
因此您可以这样做:
int size = 0;
printf("please enter array size: ");
scanf("%i", &size);
data_type data[size];
但是,如果您必须动态分配它,您可以简单地将最后一行替换为:
data_type *data = alloca(size * sizeof(*data));
ANSI C 是否允许一个人声明变量,执行一些代码(其中长度是确定的),然后声明其他变量(例如有问题的数组)?
从 1999 标准开始,您可以在一个块中混合声明和代码;在此之前,块中的所有声明都必须在代码之前。要为 C99 编译,请使用-std=c99
代替-ansi
(与 同义-std=c89
)。所以以下在 C99 中是合法的:
int main(void)
{
int size;
// get the size somehow
int *array = malloc(sizeof *array * size);
...
// don't forget to clean up when you're done
free(array);
}
如果您必须使用标志进行编译-ansi
(意味着您必须符合 C89 标准),您必须像这样构建代码:
int main(void)
{
int size;
int *array;
// get size somehow
array = malloc(sizeof *array * size);
...
free(array);
}
请注意,C99 还支持可变长度数组,它允许您在运行时指定数组的大小:
int main(void)
{
int size;
// get size as before
int array[size];
...
}
与常规数组相比,VLA 有一定的局限性(它们不能是结构或联合类型的成员,也不能出现在函数之外),必须小心使用;如果您需要分配大量空间,请malloc
改用。事实证明,它们的实现非常复杂,以至于最近批准的 2011 标准为实现提供了不支持它们的选项。