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