我想让我的阵列更灵活。我的输入来自一个文件。我从函数中获取了我的数组需要多大的信息。
我的Codesample看起来像这样:
int albumsize = getAlbumnumberFromFile(inputFile);
struct Album Alben[albumsize];
现在我必须遵循问题...我不能做这样的事情。我的IDE(Visual Studio 2017)说这个错误:
表达式必须具有常量值
谢谢Alex
虽然C标准允许可变长度数组(VLA),但Visual Studio编译器并不完全符合标准(相关的Q&A)。
但是,即使它们得到支持,我也不鼓励在这种情况下使用VLA,因为足够大的albumsize
可能导致不确定的行为。
更好的方法是动态分配内存,如下所示:
struct Album *Alben = malloc(albumsize * sizeof(*Alben));
... // Use the allocated memory here. Once you are done, free it.
free(Alben);
请注意,Alben
-the-pointer和Alben
-the-array之间的一个重要区别是你从sizeof
得到的:数组将报告其数据的大小,而指针只报告指针的大小。因此,您需要保持albumsize
的值 - 例如,在循环中迭代数组。
Microsoft不支持任何远程现代C标准。可变长度阵列在C99中引入,但MSVC仍然停留在C89上。您将需要创建一个足够大的静态大小的数组来容纳您可能需要的任何内容,或者malloc一个适当大小的数组。
MSVC不是C编译器。它是一个C ++编译器,具有一些C兼容性。据我所知,微软不提供纯C编译器。
由于VLA(可变长度数组)不是C ++标准的一部分,它们是C标准的一部分(甚至可选)MSVC决定不支持它们。您将不得不为您的阵列使用动态内存分配,我承认这不是很方便。