我正在学习C ++,我刚刚读到了动态数组,以及它如何让你在运行时而不是在编译期间设置数组的长度。但是,您不需要动态数组来执行此操作。那么动态数组有什么意义呢?你什么时候用它?我觉得我错过了一些明显的东西,所以任何见解都非常感激。谢谢!
// Static binding.
int size = 0;
cout << "Enter size of array:" << endl;
cin >> size;
int array[size];
int array_length = sizeof(array) / sizeof(int);
cout << "Number of elements in array: " << array_length << endl;
// I just set the length of an array dynamically without using a dynamic array.
// So whats the point of a dynamic array then?
答案 0 :(得分:3)
我认为你不能用C ++做到这一点。只有C99允许可变长度数组。
这甚至可以编译吗?你在谈论vector
班吗?
编辑:
它无法在Visual Studio 2010中编译:
1>..\main.c(207): error C2057: expected constant expression
1>..\main.c(207): error C2466: cannot allocate an array of constant size 0
1>..\main.c(207): error C2133: 'array' : unknown size
1>..\main.c(209): error C2070: 'int []': illegal sizeof operand
答案 1 :(得分:1)
如果你事先不知道你将拥有多少项,你需要一个动态分配的数组。
另一个(也是更好的)选项是使用std::vector
。
答案 2 :(得分:1)
根据标准,“静态”定义的数组将:
因此,您选择动态分配的数组(使用new type[]
)的原因是因为您在编译时并不总是知道数组所需的大小,并且堆栈是一个有限的资源,你经常需要小心不要筋疲力尽。
但实际上,使用std :: vector或其他STL容器代替任何类型的内置数组通常都是最好的服务。
答案 3 :(得分:1)
您的示例不会在符合标准的编译器下编译。例如,GCC说:
在函数'int main()'中:
第13行:错误:ISO C ++禁止变量大小的数组'数组'
由于-Wfatal-errors而导致编译终止。
有一种使用alloca函数动态分配堆栈内存的方法。但是,当函数终止时,此内存无效。您通常应该更喜欢new[]/delete[]
或std::vector
进行动态内存分配。
答案 4 :(得分:0)
您可以使用关键字new动态创建数组。
假设您提前知道您需要多少值。当用户可能只输入一些值时,声明一个数组a [100]是浪费空间。此外,用户可能会输入更多值,然后您将遇到阵列溢出错误。
您可以动态创建一个数组,如 - int a = new int []
此外,在堆栈上创建静态创建的数组,其中在堆上创建动态创建的数组 - 这意味着即使在函数超出范围之后内存也是全局可用的。