当将return从new int[10][3]转换为int**指针时,使用它的程序输出:

When casting return from new int[10][3] to int** pointer, the program using it outputs : Segmentation fault: 11?

本文关键字:int 输出 程序 new return 当将 转换 指针      更新时间:2023-10-16

为什么这个程序输出:段错误:11

#include <iostream>
using namespace std;
int main(){
    int **a = (int**)new int[10][3];
    a[0][0] = 1; a[0][1] = 2; a[0][2] = 3;
    cout << a[0][0] << "," << a[0][1] << "," << a[0][2];
    return 0;
}

修改此声明

int **a = (int**)new int[10][3];

int ( *a )[3] = new int[10][3];

否则,操作符new返回的指针int **int ( *a )[3]不兼容。

问题是,在表达式a[0]时,a具有类型int **,编译器试图读取分配的未初始化内存作为类型int *的指针的有效值。

还应该删除程序末尾的指针

delete [] a;

另一种方法是如下

int **a = new int * [10];
for ( size_t i = 0; i < 10; i++ ) a[i] = new int[3];

在这种情况下,分配的内存按以下方式释放

for ( size_t i = 0; i < 10; i++ ) delete [] a[i];
delete [] a;