即使2D数组的设置值在数组的sizeof范围内,也会在设置2d数组的值时遇到分段错误

时间:2019-02-18 08:58:00

标签: c multidimensional-array segmentation-fault

我要声明并打印一个简单的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;

}

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);
}