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

Creating a 2D Array using dynamic memory allocation in C++

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

#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; 
}

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

VS Code with MinGW (MinGW.org GCC-6.3.0-1) -> 已成功编译所有想要的输出。

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

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

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

在这个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

如你所写

I then compiled the same code by commenting the marked line in different compilers.

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