我要声明并打印一个简单的2d数组或矩阵。
我遇到了由设置矩阵值的嵌套for循环引起的分段错误。
int rows, columns;
rows = columns = 3;
int **matrix;
matrix = malloc(sizeof(int) * rows);
for (int i = 0; i < columns; i++) {
matrix[i] = malloc(sizeof(int) * columns);
}
这会引发段错误
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
matrix[i][j] = 1;
}
}
如果我将i设置为1,则没有段。错误。
for (int i = 1; i < rows; i++) {
for (int j = 0; j < columns; j++) {
matrix[i][j] = 1;
}
}
但是,它的确使前3个值随机打印。
整个代码
int main(int argc, char const *argv[]) {
int rows, columns;
rows = 3;
columns = 3;
int **matrix;
matrix = malloc(sizeof(int) * rows);
for (int i = 0; i < columns; i++) {
matrix[i] = malloc(sizeof(int) * columns);
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
matrix[i][j] = 1;
}
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
matrix[i][j] = 1;
}
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
printf("%d\n", matrix[i][j]);
}
}
for (int i = 0; i < rows; i++) {
free(matrix[i]);
}
free(matrix);
return 1;
}
答案 0 :(得分:4)
您的问题在这里:
int **matrix;
matrix = malloc(sizeof(int) * rows);
您希望matrix
是要作为 int指针的数组,但是您使用的是“ sizeof int”而不是“ sizeof int指针”。试试:
int **matrix;
matrix = malloc(sizeof(int*) * rows);
或更佳
int **matrix;
matrix = malloc(rows * sizeof *matrix);
@ n.m在评论中指出以下内容:
for (int i = 0; i < columns; i++) {
matrix[i] = malloc(sizeof(int) * columns);
}
是错误的。应该是:
for (int i = 0; i < rows; i++) { // Notice this change
matrix[i] = malloc(sizeof(int) * columns);
}