1

我正在使用malloc为矩阵分配内存,但之后我对矩阵进行的任何访问以设置元素,例如让我出现分段错误。

这就是我现在正在做的事情:

int **matrix = malloc(rows_number * columns_number * sizeof(int));

if (matrix) matrix[0][0] = 1;

为什么矩阵创建后无法访问?调用成功,malloc所以我有足够的连续内存用于整个矩阵。

4

4 回答 4

2

int **matrix声明matrix为指向 . 的指针的指针int。你想要一个指向数组的指针int。这将是int (*matrix)[columns_number]。您可以通过以下方式很好地分配它:

int (*matrix)[columns_number] = malloc(rows_number * sizeof *matrix);
于 2012-12-19T19:47:11.570 回答
2

这里的问题是您只分配了内存,但您已将对象声明为一组指向指针的指针。双下标需要一个指向每一行的指针向量一个告诉编译器有多少列的类型。

所以一些选项是:

  • 用代码做下标计算,也许使用宏
  • 做两个mallocs()并初始化一个行指针向量
  • malloc 特定类型的对象,以便编译器可以看到它

例如...

int (*matrix)[ROWS][COLS] = malloc(ROWS * COLS * sizeof(int));
...
(*matrix)[i][j]

以下声明也将起作用:

int (*matrix)[][COLS] = malloc(ROWS * COLS * sizeof(int));
于 2012-12-19T19:48:22.013 回答
1

您已为int 指针的动态数组分配内存,而不是int 元素。你可以尝试这样的事情:

int *matrix_storage = malloc(rows_number * columns_number * sizeof(int));
int **matrix = malloc(rows_number * sizeof(int*));
for( int i = 0; i < rows_number; ++i )
    matrix[i] = &matrix_storage[ i * columns_number ];
于 2012-12-19T19:47:25.050 回答
1

Malloc 返回一个 void 指针,因此您没有创建二维数组。尝试类似:

int **matrix;
matrix = malloc(rows_number * sizeof(int*));
for (int i=0; i<rows_number; i++)
    matrix[i] = (int*)malloc(columns_number * sizeof(int));
于 2012-12-19T19:52:00.527 回答