简体   繁体   中英

Getting a segmentation fault on setting value for 2d array, even though for loop counter values are inside the sizeof of array

I am declaring and printing a simple 2d array or matrix.

I am getting a segmentation fault that is being caused by the nested for loop that sets the values of the matrix.

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

This throws a seg fault

for (int i = 0; i < rows; i++) {            
    for (int j = 0; j < columns; j++) {
        matrix[i][j] = 1;
    }
}

If I set i = 1, there is no seg. fault.

for (int i = 1; i < rows; i++) {            
    for (int j = 0; j < columns; j++) {
        matrix[i][j] = 1;
    }
}

However, it does make the first 3 values printed random though.

-------

Entire Code

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;

}

Your problem is here:

int **matrix;
matrix = malloc(sizeof(int) * rows);

You want matrix to be an array of pointers to int but you use "sizeof int" instead of "sizeof int pointer". Try:

int **matrix;
matrix = malloc(sizeof(int*) * rows);

or better

int **matrix;
matrix = malloc(rows * sizeof *matrix);

As pointed out by @nm in a comment, the following:

for (int i = 0; i < columns; i++) {
    matrix[i] = malloc(sizeof(int) * columns);
}

is wrong. It shall be:

for (int i = 0; i < rows; i++) {   // Notice this change
    matrix[i] = malloc(sizeof(int) * columns);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM