【发布时间】:2016-12-04 14:23:41
【问题描述】:
每当我需要创建一个包含许多直到执行时才知道的元素的数组时,我都会这样做。
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;
我应该使用哪一个?什么时候不能保证有效?只是浪费内存还是需要维护传统?
【问题讨论】:
-
如果要在 C 中实现动态数组,请使用动态内存分配。
-
两者都不是。使用
int * myArray = malloc( n * sizeof *myArray);之类的东西,然后在完成后进行清理。 -
完全符合C99版本的标准。它被称为可变长度数组(VLA)。由于一些未知的原因,委员会在当前版本 (C11) 中将 VLA 设为可选 - 违背了他们不惜一切代价建立的向后兼容实践。我仍然建议使用它。现代桌面编译器将支持它(例如 gcc 和 clang)。不要使用 MSVC 等过时的编译器。现代 C 语言也存在其他问题。有时必须进行削减。 WQe 也不再使用马车了。或莫尔斯电子邮件。你的博士应该继续前进
-
@clarasoft-it:VLA 不是动态分配的数组,而是普通的自动变量。
-
以防我的评论不清楚:使用 VLA,但要确保它们不会溢出堆栈(与任何其他自动变量一样!)。使用现代编译器,不要以 1k 美元/欧元/等价格出售它们的供应商提供过时的垃圾。没有前进。
标签: c arrays variable-length-array