有人能说出这段代码有什么问题吗,它会在执行时立即终止

问题描述

给定的代码试图使用动态内存分配指针来初始化矩阵

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 未初始化,尝试写入 *aundefined behavior(UB)。

解决这个问题的一种方法是编写a = new int[3],但这不会编译,因为aint **(指向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。