【问题标题】:Are dynamic arrays allocated contiguously in memory?动态数组是否在内存中连续分配?
【发布时间】:2021-02-09 06:01:01
【问题描述】:

int* arr = new int[5];

arr 指向的数组的值是否在堆中连续分配?

谢谢。

【问题讨论】:

  • int *arr = int[5] 不正确 - 您遗漏了关键字 new。数组的元素在内存中是连续的。除其他外,这就是指针算术起作用的原因。 “堆”是一个过时的术语,指的是特定的内存模型 - 并非所有实现都需要使用它。
  • 如果不是连续的,它怎么可能工作?你必须能够索引它,做指针算术等等。
  • 具有动态存储持续时间的对象不一定分配在堆上。在实践中它们可能是,但这不是语言的要求。
  • @Barmar 即使是多维数组也会一样吗?我在想也许一个级别是连续的,但每个级别可能与另一个级别不连续

标签: c++ arrays memory heap-memory


【解决方案1】:

动态数组的正确语法是int* arr = new int[5];。是的,它将被连续分配。

这不是使用数组的推荐方式。如果您在编译时知道数组大小并且它不是太大,请将其设为本地:int arr[5];std::array<int,5> arr;。否则,请使用std::vector<int> arr(5);new 在现代 C++ 中应该很少使用。

编辑: 像这样分配的真正的多维动态数组

int (*arr2)[6] = new int[5][6];
int (*arr3)[6][7] = new int[5][6][7];

也是连续的。 但是如果你使用一维指针数组并为每个指针分配动态数组:

int** arrp = new int*[5];
for(int i=0; i<5; i++)
    arrp[i] = new int[6]; 

那么arrp 中的数据不是连续的,即使你可以像arr2 一样使用它,例如:

arrp[2][3] = 4 

【讨论】:

  • 就算是多维数组也会一样吗?我在想也许一个级别是连续的,但每个级别可能与另一个级别不连续
  • 是的,如果它确实是多维数组而不是指针数组。
  • 抱歉澄清一下,你是说多维动态数组确实也是连续存储在内存中的吧
  • 所有单次分配都是连续的——否则指针运算会中断。我怀疑当您考虑分配 pointers 然后分配块以分配给每个指针时,您会感到困惑。在这种情况下,指针块将是连续的,但没有理由让任何后续分配与其连续(它们是单独的分配)
猜你喜欢
  • 2013-08-13
  • 2014-05-15
  • 2023-04-08
  • 2014-09-29
  • 2011-01-15
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
相关资源
最近更新 更多