我正在使用 malloc
为矩阵分配内存,但是之后我对矩阵进行任何访问以设置元素,例如,我会使我有分割错误。
这是我现在正在做的:
int **matrix = malloc(rows_number * columns_number * sizeof(int));
if (matrix) matrix[0][0] = 1;
创建矩阵为什么无法访问矩阵?malloc
调用成功,因此我有足够的连续内存,以便整个矩阵。
这里的问题是您已经分配了存储器,但是您已将对象声明为指针的一组指针。双下标需要指向每行或的指针向量,该类型告诉编译器有多少列。
所以有些选择是:
- 使用代码进行下标计算,也许使用宏
- 做两个
mallocs()
并初始化一个行指针向量 - malloc是特定类型的对象,以便编译器可以看到它
例如...
int (*matrix)[ROWS][COLS] = malloc(ROWS * COLS * sizeof(int));
...
(*matrix)[i][j]
以下声明也将有效:
int (*matrix)[][COLS] = malloc(ROWS * COLS * sizeof(int));
int **matrix
将 matrix
声明为指向int
指针的指针。您想要一个指针到int
的数组。这是int (*matrix)[columns_number]
。您可以很好地分配:
int (*matrix)[columns_number] = malloc(rows_number * sizeof *matrix);
您已经为 int pointers 的动态数组分配了内存,而不是 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 ];
malloc返回一个void指针,因此您尚未制作2维数组。尝试以下操作:
int **matrix;
matrix = malloc(rows_number * sizeof(int*));
for (int i=0; i<rows_number; i++)
matrix[i] = (int*)malloc(columns_number * sizeof(int));