在 C++ 中使用动态内存分配创建二维数组

Posted

技术标签:

【中文标题】在 C++ 中使用动态内存分配创建二维数组【英文标题】:Creating a 2D Array using dynamic memory allocation in C++ 【发布时间】:2021-12-20 13:01:19 【问题描述】:

我正在尝试使用动态内存分配来实现二维数组。这是我的代码:

#include <iostream> 
using namespace std; 

int main() 
 

int r, c; 
cin >> r >> c; 
int** p = new int*[r]; 

for (int i = 0; i < r; i++) 
 
    p[i] = new int[c]; //this line here is the marked line
 

for (int i = 0; i < r; i++) 
 
    for (int j = 0;j <c; j++) 
     cin >> p[i][j]; 
     


for (int i = 0; i < r; i++) 
 
    for (int j = 0;j <c; j++) 
 
    cout << p[i][j]<<" "; 
     
 
cout<<"\n"; 
for (int i = 0; i < r; i++) 
 
    delete [] p[i]; 
 
delete [] p; 
return 0; 

然后我通过在不同的编译器中注释标记的行来编译相同的代码。

带有 MinGW 的 VS 代码 (MinGW.org GCC-6.3.0-1) -> 成功编译并包含所有想要的输出。

Jdoodle 和其他在线编译器(在 c++14 和 c++17 最新版本中都试过)-> 程序在读取数组元素的第二个输入后给出分段错误(读取 r、c 和前 2 个输入数组成功)。

有人可以解释一下,在 VS CODE 中,我如何获得正确的输出?如果标记的行被注释,则使用哪个内存、堆或堆栈?标记的行被注释和不被注释时有什么区别?分段错误的原因是什么?谢谢。

【问题讨论】:

谁能解释一下,IN VS CODE,我如何得到正确的输出? -- 程序坏了。你在问为什么你可以拿一张破桌子把东西放在上面,一切都很好,但是有另一个破桌子,当你把同样的东西放在桌子上时桌子就会散架。顺便说一句,你用来创建这个二维数组的方法是最糟糕的方法之一(如果你必须使用指针)——见this answer 您在标记的行中有一个小错字。请将p[i] = new int[i + 1]; 替换为p[i] = new int[c];,因为您想为每一行分配列。 i+1 是当前行+1,而不是列数。 嗨@ArminMontigny,感谢您的指出。更正了它。我实际上是在尝试是否可以得到一个锯齿状数组。但是是的,我的问题是什么时候 'p[i] = new int [c]' 【参考方案1】:

通常,程序具有未定义的行为。

在这个for循环中

for (int i = 0; i < r; i++) 
 
    p[i] = new int[i + 1]; //this line here is the marked line
 

在您分配i + 1 元素的数组的每一“行”中。但在下一个 for 循环中(以及后续循环中)

for (int i = 0; i < r; i++) 
 
    for (int j = 0;j <c; j++) 
     cin >> p[i][j]; 
     

您正在尝试访问每行中的c 元素,这与实际分配了多少元素无关。因此,如果c 大于 1,那么至少在循环的第一次迭代中,会尝试访问已分配数组之外的内存。

编辑:如果您评论了这一行

p[i] = new int[c]; //this line here is the marked line

正如你所写的

然后我通过注释标记的行来编译相同的代码 不同的编译器。

然后程序再次出现未定义的行为。那就是您正在使用未初始化的指针。这意味着任何事情都可能发生。

【讨论】:

嗨。我的问题是什么时候'p [i] = new int [c]'。我纠正了它。抱歉打错了。谢谢。 @CodeHackeRツ 见我附加的答案。 好的,弗拉德。谢谢回答。我得到了段错误的原因。另外,内存呢?我的意思是,如果我使用注释代码,堆栈或堆中的内存会用于存储元素吗?或者这也不确定? @CodeHackeRツ 如果您取消注释该行,那么程序将是正确的。它访问动态分配的数组。如果要注释该行,则程序使用存储在指针 p 指向的第一个分配数组中的不确定值。 嘿弗拉德。感谢所有的解释。接受。

以上是关于在 C++ 中使用动态内存分配创建二维数组的主要内容,如果未能解决你的问题,请参考以下文章

需要有关 C++ 中二维数组的动态内存分配的帮助

C++:使用函数为二维数组分配内存时出错

c++ 二维数组内存分配

如何在 C++ 中为二维对象数组分配内存? [复制]

c++ 动态分配二维数组 new 二维数组

C# 中锯齿状数组的内存分配与 C++ 中的二维数组内存分配