是否可以创建具有可变数量元素的数组?

时间:2016-07-29 19:18:38

标签: c arrays variable-length-array

每当我需要创建一个数组,其中包含许多在执行时才知道的元素,我就这样做了。

int n, i;
printf("Number of elements: ");
scanf("%d", &n);
int myArray[n];
for(i = 0; i < n; i++)
    myArray[i] = 0;

然而,3个拥有计算机科学博士学位的人告诉我不要这样做,因为“它不能保证能够在每个编译器上工作”,并且在编译时必须知道数组中元素的数量-时间。所以他们这样做。

int myArray[1000];
int n, i;
printf("Number of elements: ");
scanf("%d, &n);
//we must stop at the n element
for(i = 0; i < n; i++)
    myArray[i] = 0;

我应该使用哪一个?什么时候不能保证工作?这只是一种记忆浪费还是需要保留遗产?

2 个答案:

答案 0 :(得分:1)

  

“不保证能够在每个编译器上运行”

是的,基本上,正确。

第一种方法VLA, variable length arrayC99标准的一部分。但是,

  • C11中,已成为可选项。你最好不要依赖这个功能。
  • C89没有将其作为标准的端口。但是,有gcc个扩展来支持他们。

引用C11,章节§6.7.6.2/ p5

  

[....]如果大小是整数常量表达式   并且元素类型具有已知的常量大小,数组类型不是可变长度   数组类型;否则,数组类型是可变长度数组类型。 (可变长度   数组是实现不需要支持的条件特性;见6.10.8.3。)

作为替代方法,如果必须依赖运行时值,则可以始终使用指针和动态内存分配,如malloc()和family。

合在一起,回答问题

  

是否可以创建具有可变数量元素的数组?

这是可能的,但仅限于VLA支持。如果没有这个,你必须使用指针和内存分配函数来满足自己的需求。

答案 1 :(得分:1)

如果您想要符合C89并且不使用太多内存的东西,那么第三个选项就是动态分配内存:

int n, i;
printf("Number of elements: ");
scanf("%d", &n);
int *myArray = malloc(sizeof(int)*n);   // allocate space for n ints
if (myArray == NULL) {
    perror("malloc failed");
    exit(1);
}
for(i = 0; i < n; i++)
    myArray[i] = 0;

完成后,请确保在已分配的内存上调用free