【问题标题】:What is the difference between an array and a dynamic array?数组和动态数组有什么区别?
【发布时间】:2011-01-21 19:58:06
【问题描述】:

以下两种数组有什么区别?

int array1[10];
int* array2 = new int[10];

【问题讨论】:

    标签: c++ arrays dynamic-allocation


    【解决方案1】:

    主要区别在于动态数组是在堆上创建的。动态数组的大小可以在运行时确定。

    以下区别:

    int x = 10;
    int array1[10];
    int *array2 = new char[x];
    

    array2 是否指向数组的第一个元素,而不是实际的完整数组。

    注意:

    assert(sizeof(array1) == 40);
    assert(sizeof(array2) == 4);
    

    使用 new 创建的堆上的内存最终应该使用delete 销毁。 由于array2 是在堆上创建的,并且是一个数组,因此您需要使用delete[] 将其删除。

    注意:您实际上可以创建指向完整数组的指针,而不仅仅是第一个元素:

    int array1[10];
    int *pointerToFirstElement = array1;
    int (*pointerToFullArray)[10] = &array1;
    int sizeOfFirstPointer = sizeof(pointerToFirstElement);
    int sizeOfSecondPointer = sizeof(pointerToFullArray);
    assert(sizeOfFirstPointer == sizeOfSecondPointer);//==4 since both are pointers
    

    但是他们指出的大小不同:

    int sizeOfFirst = sizeof(*pointerToFirstElement);
    int sizeOfSecond = sizeof(*pointerToFullArray);
    assert(*sizeOfFirst == 4);
    assert(*sizeOfSecond == 40);
    

    【讨论】:

    • "它的大小可以在编译时确定。" - 应该是 "can't" 还是指非动态数组?
    • 顺便说一句,我一直认为int (*pointerToFullArray)[10] = new int[10]; 应该在 C++ 中被允许和要求。
    【解决方案2】:

    动态数组是在运行时从堆内存创建的,可以根据需要使用 new/delete 关键字动态调整大小/释放。数组是在编译时静态定义的,并且始终会占用该数量的内存。

    【讨论】:

      猜你喜欢
      • 2018-01-26
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 2016-08-10
      • 2016-07-19
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      相关资源
      最近更新 更多