在C中为矩阵分配内存,为什么我之后无法访问矩阵?

时间:2012-12-19 19:44:28

标签: c memory-management matrix malloc

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

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

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

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

为什么我在创建矩阵后无法访问它? malloc调用成功,因此我对整个矩阵有足够的连续内存。

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

所以有些选择是:

  • 使用代码进行下标计算,可能使用宏
  • 执行两个mallocs()并初始化行指针向量
  • malloc是特定类型的对象,因此编译器可以看到它

例如......

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

以下声明也适用:

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

答案 2 :(得分:1)

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

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 ];

答案 3 :(得分: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));