动态数组和普通数组之间的区别

时间:2013-06-15 04:08:41

标签: c++ arrays dynamic

我是个乞丐。我对它们之间的区别感到困惑。我已经阅读了几个答案并且意识到其中一个不同之处在于可以删除动态数组,而普通数组则不能。但是还有其他差异吗?比如它们的功能,大小或者什么?

我已经阅读了这样一个例子,如果用正常数组{int p [i];}替换动态数组{p = new(nothrow)int [i];},我认为没有任何区别

    #include <iostream>
    #include <new>
    using namespace std;
    int main ()
    {
      int i,n;
      int * p;
      cout << "How many numbers would you like to type? ";
      cin >> i;
      p= new (nothrow) int[i];
      if (p == 0)
      cout << "Error: memory could not be allocated";
      else
      {
        for (n=0; n<i; n++)
        {
          cout << "Enter number: ";
          cin >> p[n];
        }
        cout << "You have entered: ";
        for (n=0; n<i; n++)
        cout << p[n] << ", ";
        delete[] p;
      }
      return 0;
    }

2 个答案:

答案 0 :(得分:3)

  

但是还有其他差异吗?

编译并运行它,看看会发生什么:

int main(int argc, char** argv){
    char buffer[1024*1024*64];
    buffer[0] = 0;
    return 0;
}

说明:

  1. 好吧,普通数组放在堆栈上或代码段内(如果它是全局变量或静态局部变量)。至少在Windows / Linux PC上。堆栈的大小有限(虽然您可以使用linux中的ulimit和Windows上的编译器设置来更改它)。因此你的数组对于堆栈来说太大了,你的程序会在进入带有该数组的函数时立即崩溃(linux上的“分段错误”,“堆栈溢出”或Windows上的“访问冲突”(forgoet which))。 Windows(x86)上数组大小的默认限制为1兆字节,Linux上为8兆字节。

  2. 您无法确定使用new分配的块的大小。 int *p = new int[146]; std::cout << sizeof(p) << std::endl。将打印sizeof(int *),而不是已分配内存的大小。但是,sizeof适用于数组。

  3. 理论上,使用动态内存分配,您可以根据需要分配尽可能多的内存(但操作系统可能会施加限制,而在32位系统上,最大分配的块大小将为2..3 GB)。您还可以通过释放内存来控制资源使用情况,这样您的程序就不会无缘无故地使用系统ram / swap文件。

  4. 动态数组不会自动释放,您手动delete

  5. 这只是一个简短的概述。

    动态内存分配提供了更好的资源控制,并消除了局部变量的一些限制。

    说到这一点,尽管您可以使用new / delete,但如果您想使用大小可变的数组,则应使用std::vector。手动内存管理容易出错,因此您应该尽可能让编译器为您完成。因此,建议至少研究STL(Standard Template Library)smart pointersRAIIRule of Three

答案 1 :(得分:0)

动态就是这样。您可以在运行时而不是编译时更改结果数组的大小。有一些编译器扩展允许您像动态数组一样使用静态数组(int数组[CONSTANT]),因为您可以在运行时指定大小,但这些是非标准的。

动态数组也在堆上而不是堆栈上分配。这允许您在必要时使用所有可用内存来创建阵列。堆栈的大小有限,取决于操作系统。

在堆上分配内存允许您执行此操作:

int* createArray(int n) {  
    int* arr = new int[n];  
    return arr;  
}  

int main()  
{  
    int* myArray = createArray(10);  
    // this array is now valid and can be used  

    delete[] myArray;  
}

我确信动态阵列和静态阵列之间还存在许多其他复杂因素,但这些点是最重要的。