根据命令行参数为数组分配内存的正确方法是什么?

时间:2014-11-17 19:10:24

标签: c arrays memory

在编写一个程序时,我要求用户输入数字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];
}

4 个答案:

答案 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 ;
  }