[英]ANSI C Program: How to initialize numeric array when length is determined when program runs?
C 的新手。我正在编写一个 ANSI C 程序(在 Linux 上使用 gcc 4.4.6)并且需要知道如何初始化一个数值数组,例如 int 或 double,其中数组的长度在程序运行时确定跑步?
ANSI C 是否允许声明变量、执行一些代码(其中长度已确定),然后声明其他变量(例如有问题的 arrays)?
如果没有,这在实践中是如何完成的? 请注意,程序使用gcc -ansi...
开关进行编译。
要创建动态数组,您需要使用指针; 用法几乎相同,但是完成后需要 free() memory;
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 允许灵活的长度 arrays,即使在使用-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 是否允许声明变量、执行一些代码(其中长度已确定),然后声明其他变量(例如有问题的 arrays)?
从 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 还支持可变长度 arrays ,它允许您在运行时指定数组的大小:
int main(void)
{
int size;
// get size as before
int array[size];
...
}
与常规 arrays 相比,VLA 有一些限制(它们不能是结构或联合类型的成员,并且它们不能出现在函数之外),必须小心使用; 如果您需要分配大量空间,请改用malloc
。 它们的实施结果非常复杂,以至于最近批准的 2011 标准为实施提供了不支持它们的选项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.