在 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.
然后程序又出现了未定义的行为。那就是您正在使用未初始化的指针。这意味着任何事情都可能发生。
我正在尝试使用动态内存分配实现二维数组。这是我的代码:
#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.
然后程序又出现了未定义的行为。那就是您正在使用未初始化的指针。这意味着任何事情都可能发生。