为什么这行得通?
#include <iostream>
int main()
{
std::cout << "Enter a number: ";
int arraySize;
std::cin >> arraySize;
int array[arraySize];
for(int element : array)
{
element = 42;
std::cout << element << "\n";
}
std::cout << "Array size: " << sizeof(array) << "\n";
std::cout << "Element count: " << sizeof(array)/sizeof(int);
return 0;
}
我对C语言中动态存储分配的理解告诉我,需要它的一种情况是,当你不知道在编译时需要分配的内存量时。在这个程序中,显然程序编译时不知道数组大小,但它是动态的,因为它可以随着用户输入的值而变化。
这是一个程序在成功编译后运行(警告和无错误):
g程序. cpp-std=c 11-o程序.exe
输入数字:12
42
42
42
42
42
42
42
42
42
42
42
数组大小:48
元素计数:12
如您所见,使用用户定义的元素数量创建了一个数组,每个元素都成功分配给42个,并证明存在sizeof()运算符。
为什么这不算动态存储分配和编译?
这种可变长度数组(VLA)的声明不是标准的:
int array[arraySize];
此行使用g编译的原因是编译器提供了此功能作为扩展:
ISOC99中允许使用可变长度的自动数组,作为扩展GCC在C90模式和C中接受它们。这些数组与任何其他自动数组一样声明,但长度不是常量表达式。存储在声明点分配,并在包含声明的块范围退出时释放。
您在此行中声明的变量称为可变长度数组:
int array[arraySize];
可变长度数组是C编程语言的一个特性,但它们实际上并不是C的一部分。许多编译器支持可变长度数组作为编译器扩展(例如,这里是可变长度数组的gcc版本的留档),但不能保证它在所有编译器上都有效。