微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。