正在创建具有可变数量元素的数组吗?

问题描述:

每当我需要创建一个数组,其中有许多元素直到执行时间才知道,我这样做。正在创建具有可变数量元素的数组吗?

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; 

我应该使用哪一个?何时不能保证工作?这只是一种记忆浪费或需要维持遗产吗?

+0

如果要在C中实现动态数组,请使用动态内存分配。 –

+2

都不是。使用类似'int * myArray = malloc(n * sizeof * myArray);'的方法,并在完成后进行清理。 – WhozCraig

+0

它完全符合C99版本的标准。它被称为可变长度数组(VLA)。由于一些不知道的原因,委托人在当前版本(C11)中使VLA成为可选项 - 不惜一切代价向后兼容。我仍然建议使用它。现代桌面编译器将支持它(例如gcc和clang)。不要使用过时的编译器如MSVC。他们在现代C方面也有其他问题。有时候需要剪一个。 WQe不再使用马车。或莫尔斯电子邮件。您的博士应该继续 – Olaf

“它不能保证在每个编译工作”

是的,基本上是正确的。

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

  • C11,这已被制成可选。你最好不要依赖这个功能。
  • C89没有那个作为标准的端口。然而,支持它们的是gcc扩展。

引用C11,章§6.7.6.2/ P5

[....]如果尺寸是整数常量表达式 和元素类型具有已知的恒定大小,阵列类型不是可变长度 数组类型;否则,数组类型是可变长度数组类型。 (可变长度 阵列是一个条件的功能,实现方式不需要支持;参见6.10.8.3)

作为一个替代方法,可以始终使用一个指针和动态存储器分配等malloc()和家庭,如果你必须依赖运行时间值。

总之,要回答这个问题

是可能的元素数量可变的创造阵列?

这是可能的,但只有VLA支持。没有这些,最好的情况是你必须使用指针和内存分配函数。

+0

嗨Sourav!我强烈反对你的结论,不使用VLA。仅仅因为仍然有人使用马车并不意味着所有的高速公路都应该具有20公里/小时的速度限制。有足够的现代编译器支持C99,从而支持VLA。不支持C99 /完整C11的编译器可能不支持其他功能,在现代C中也是如此。C似乎是唯一一种坚持27年版本的语言,仅仅是因为人们拒绝学习新的东西并要求他们的现代特征供应商。 – Olaf

+1

@Olaf先生,谢谢你的评论。首先,我不反对VLA,我只是试图建议为_alternative_,正如你所看到的。其次,我试图为它们中的每一个指定编译器支持。如果您认为我的回答有任何偏见,请提出修改措辞或随意修改。 :) –

+0

动态分配是**不是**一般替代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上分配的内存当你完成它。

+2

....并且测试从'malloc'返回的文件# – KevinDTimm

+2

....并且,如果OP要清除内存,为什么不使用'calloc' – KevinDTimm

+0

@dbush我总是使用指针和malloc每当我需要改变大小dinamically,在这种情况下,我不知道。在使用MinGW和c89编译器标志时,它是第一种方式。为什么我应该使用它呢? (什么是“好处”) – Sheldon