动态数组与C ++中的静态绑定数组有何不同?

时间:2011-09-17 00:54:06

标签: c++

我正在学习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?

5 个答案:

答案 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)

根据标准,“静态”定义的数组将:

  1. 具有恒定大小,在编译时定义
  2. 在堆栈上分配 而不是堆。
  3. 因此,您选择动态分配的数组(使用new type[])的原因是因为您在编译时并不总是知道数组所需的大小,并且堆栈是一个有限的资源,你经常需要小心不要筋疲力尽。

    但实际上,使用std :: vector或其他STL容器代替任何类型的内置数组通常都是最好的服务。

答案 3 :(得分:1)

您的示例不会在符合标准的编译器下编译。例如,GCC说:

http://codepad.org/Kvq2PfNx

  

在函数'int main()'中:
  第13行:错误:ISO C ++禁止变量大小的数组'数组'
  由于-Wfatal-errors而导致编译终止。

有一种使用alloca函数动态分配堆栈内存的方法。但是,当函数终止时,此内存无效。您通常应该更喜欢new[]/delete[]std::vector进行动态内存分配。

答案 4 :(得分:0)

您可以使用关键字new动态创建数组。 假设您提前知道您需要多少值。当用户可能只输入一些值时,声明一个数组a [100]是浪费空间。此外,用户可能会输入更多值,然后您将遇到阵列溢出错误。 您可以动态创建一个数组,如 - int a = new int []
此外,在堆栈上创建静态创建的数组,其中在堆上创建动态创建的数组 - 这意味着即使在函数超出范围之后内存也是全局可用的。