在编写一个程序时,我要求用户输入数字N,我必须使用它为int
数组分配内存,处理这个问题的正确方法是什么:
第一种方法:
int main() {
int array[],n;
scanf("%d\n",&n);
array = malloc(n * sizeof(int));
}
或第二种方法:
int main() {
int n;
scanf("%d\n",&n);
int array[n];
}
答案 0 :(得分:4)
任何一个都可以工作(虽然第一个案例需要从int array[]
更改为int *array
);差异取决于数组的存储位置。
在第一种情况下,数组将存储在堆中,而在第二种情况下,它(很可能)存储在堆栈中。当它存储在堆栈中时,基于堆栈大小的限制,阵列的最大大小将受到更多限制。但是,如果它存储在堆中,它可能会大得多。
答案 1 :(得分:1)
您的第二种方法称为可变长度数组(VLA),仅在c99时支持。这意味着如果您希望您的代码与较旧的编译器兼容(或者被老年人阅读和理解......),您可能必须回到第一个更标准的选项。请注意,动态分配数据需要适当的维护,其中最重要的部分是 - 在完成后将其释放(在程序中不执行)
答案 2 :(得分:1)
假设您打算使用int *array;
而不是int array[];
(第一个不会编译)。
始终使用第一种方法,除非您知道阵列大小非常小和您对将要运行的平台有深入的了解。当然,问题是小到小有多小?
第二种方法的主要问题是没有可移植的方法来验证VLA(可变长度数组)分配是否成功。优点是您不必管理内存,但考虑到内存分配失败时未定义行为的风险,这几乎不是“优势”。
它是在C99中引入的,并且在C11中是可选的。这表明委员会发现它并不那么有用。此外,C11编译器可能不支持它,您必须通过检查是否已定义__STDC_NO_VLA__
来执行额外检查您的编译器是否支持它。
小int my_arr[10];
数组的自动存储分配可能会失败。这在现代操作系统中是一个极端且不切实际的例子,但在理论上是可能的。所以我建议在任何严肃的项目中避免使用VLA。
答案 3 :(得分:0)
你说你想要一个COMMAND LINE参数:
int main (int argc, char **argv)
{
int *array ;
int count ;
if (argc < 2)
return 1 ;
count = atoi (argv[1]) ;
array = malloc (sizeof(int)*count) ;
. . . . .
free (array) ;
return 0 ;
}