正在创建具有可变数量元素的数组吗?
每当我需要创建一个数组,其中有许多元素直到执行时间才知道,我这样做。正在创建具有可变数量元素的数组吗?
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;
我应该使用哪一个?何时不能保证工作?这只是一种记忆浪费或需要维持遗产吗?
“它不能保证在每个编译工作”
是的,基本上是正确的。
第一种方法VLA, variable length array是C99
标准的一部分。但是,
- 在
C11
,这已被制成可选。你最好不要依赖这个功能。 -
C89
没有那个作为标准的端口。然而,支持它们的是gcc
扩展。
引用C11
,章§6.7.6.2/ P5
[....]如果尺寸是整数常量表达式 和元素类型具有已知的恒定大小,阵列类型不是可变长度 数组类型;否则,数组类型是可变长度数组类型。 (可变长度 阵列是一个条件的功能,实现方式不需要支持;参见6.10.8.3)
作为一个替代方法,可以始终使用一个指针和动态存储器分配等malloc()
和家庭,如果你必须依赖运行时间值。
总之,要回答这个问题
是可能的元素数量可变的创造阵列?
这是可能的,但只有VLA支持。没有这些,最好的情况是你必须使用指针和内存分配函数。
嗨Sourav!我强烈反对你的结论,不使用VLA。仅仅因为仍然有人使用马车并不意味着所有的高速公路都应该具有20公里/小时的速度限制。有足够的现代编译器支持C99,从而支持VLA。不支持C99 /完整C11的编译器可能不支持其他功能,在现代C中也是如此。C似乎是唯一一种坚持27年版本的语言,仅仅是因为人们拒绝学习新的东西并要求他们的现代特征供应商。 – Olaf
@Olaf先生,谢谢你的评论。首先,我不反对VLA,我只是试图建议为_alternative_,正如你所看到的。其次,我试图为它们中的每一个指定编译器支持。如果您认为我的回答有任何偏见,请提出修改措辞或随意修改。 :) –
动态分配是**不是**一般替代VLA。不仅功能对大多数实现不可用 - 而且大多数实现都是独立的,没有标准库中不需要的部分。然后,如果你需要多维数组,它们是不可用的,因为如果你使用动态分配,你需要一个指向2D的VLA。 – Olaf
如果你想要的东西,是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
上分配的内存当你完成它。
....并且测试从'malloc'返回的文件# – KevinDTimm
....并且,如果OP要清除内存,为什么不使用'calloc' – KevinDTimm
@dbush我总是使用指针和malloc每当我需要改变大小dinamically,在这种情况下,我不知道。在使用MinGW和c89编译器标志时,它是第一种方式。为什么我应该使用它呢? (什么是“好处”) – Sheldon
如果要在C中实现动态数组,请使用动态内存分配。 –
都不是。使用类似'int * myArray = malloc(n * sizeof * myArray);'的方法,并在完成后进行清理。 – WhozCraig
它完全符合C99版本的标准。它被称为可变长度数组(VLA)。由于一些不知道的原因,委托人在当前版本(C11)中使VLA成为可选项 - 不惜一切代价向后兼容。我仍然建议使用它。现代桌面编译器将支持它(例如gcc和clang)。不要使用过时的编译器如MSVC。他们在现代C方面也有其他问题。有时候需要剪一个。 WQe不再使用马车。或莫尔斯电子邮件。您的博士应该继续 – Olaf