Получение ошибки сегментации при установке значения для 2d массива, даже если значения счетчика цикла находятся внутри sizeof массива - PullRequest
0 голосов
/ 18 февраля 2019

Я объявляю и печатаю простой двухмерный массив или матрицу.

Я получаю ошибку сегментации, вызванную вложенным циклом 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 голосов
/ 18 февраля 2019

Ваша проблема здесь:

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

Вы хотите, чтобы matrix был массивом указателей на int , но вы используете "sizeof int" вместо "sizeof int pointer",Попробуйте:

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

или лучше

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

Как указано @nm в комментарии, следующее:

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