我正在使用malloc
为矩阵分配内存,但之后我对矩阵进行的任何访问以设置元素,例如让我出现分段错误。
这就是我现在正在做的事情:
int **matrix = malloc(rows_number * columns_number * sizeof(int));
if (matrix) matrix[0][0] = 1;
为什么矩阵创建后无法访问?调用成功,malloc
所以我有足够的连续内存用于整个矩阵。
我正在使用malloc
为矩阵分配内存,但之后我对矩阵进行的任何访问以设置元素,例如让我出现分段错误。
这就是我现在正在做的事情:
int **matrix = malloc(rows_number * columns_number * sizeof(int));
if (matrix) matrix[0][0] = 1;
为什么矩阵创建后无法访问?调用成功,malloc
所以我有足够的连续内存用于整个矩阵。
int **matrix
声明matrix
为指向 . 的指针的指针int
。你想要一个指向数组的指针int
。这将是int (*matrix)[columns_number]
。您可以通过以下方式很好地分配它:
int (*matrix)[columns_number] = malloc(rows_number * sizeof *matrix);
这里的问题是您只分配了内存,但您已将对象声明为一组指向指针的指针。双下标需要一个指向每一行的指针向量或一个告诉编译器有多少列的类型。
所以一些选项是:
mallocs()
并初始化一个行指针向量例如...
int (*matrix)[ROWS][COLS] = malloc(ROWS * COLS * sizeof(int));
...
(*matrix)[i][j]
以下声明也将起作用:
int (*matrix)[][COLS] = malloc(ROWS * COLS * sizeof(int));
您已为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 ];
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));