问题描述
给定的代码试图使用动态内存分配指针来初始化矩阵
int main()
{
int **a;
*a=new int[3];
for(int i=0;i<3;i++)
{
a[i]=new int[3];
a[i]=0;
}
cout<<"Enter 3x3 Matrix : ";
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
cin>>a[i][j];
}
}
//display matrix
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
cout<<a[i][j]<<" ";
}
cout<<"\n";
}
for(int i=0;i<3;i++)
delete a[i];
delete []a;
return 0;
}
只需在执行时立即终止,无需任何输入...
解决方法
行 *a=new int[3];
可能会导致程序崩溃。
由于 a
未初始化,尝试写入 *a
是 undefined behavior(UB)。
解决这个问题的一种方法是编写a = new int[3]
,但这不会编译,因为a
是int **
(指向int
的指针),而不是{ {1}}。
安抚编译器的一种方法是制作 int *
,这将分配一个指向 3 个整数指针数组的指针。
在那之后,还有一件事使代码失败:
在行 a = new int*[3]
上,您将新分配的整数数组的值分配给 a[i]=new int[3];
,这很好,但是随后您编写了 a[i]
,这会将指针更改为 { {1}} 值,因此当您尝试写入 a[i]=0;
时代码会失败。
(我相信)您可能希望将分配的数组初始化为 0。在这种情况下,您应该执行另一个 NULL
将每个 a[i][j]
设置为 0。
释放数组时还有一个微妙的问题。我相信您希望 for
是指向数组的指针,因此您应该使用 a[i][j]
而不是 a[i]
。使用错误的 delete[] a[i]
(或不使用 delete a[i]
)也是 UB。