在 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++ 中使用动态内存分配创建二维数组的主要内容,如果未能解决你的问题,请参考以下文章