C Ошибка сегментации при использовании scanf для двумерного массива - PullRequest
0 голосов
/ 17 февраля 2020

Как предложено в книге «Готфрид», я попытался ввести массив и отобразить содержимое массива в матричной форме:

#include<stdio.h>

#define row 2
#define col 3

int main(){
    int (*a)[col];
    int i,j;

    for(i=0;i<row;i++){
        for(j=0;i<col;j++){
            printf("Enter a(%d,%d)",i,j);
            scanf("%d",(*(a+i)+j));
        }
    }

    return 0;
}

После ввода элемента я получаю следующий вывод:

Ошибка сегментации (ядро сброшено)

В чем проблема в коде? Работало ли это в предыдущей версии G CC, поэтому писатель записал это? Как правильно решить проблему с таким же уровнем простоты?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

Если вы хотите объявить a как указатель на массив col int с, как это делается в этой строке

int (*a)[col];

Затем вы должны также выделить (и в конечном итоге освободить ) память, необходимая, прежде чем пытаться ее использовать.

a = malloc(sizeof(*a) * row);
if (!a)
    exit(1);
// ...
free(a);

В опубликованном коде также есть другая проблема во вложенных циклах

for (i = 0; i < row; i++) {
    for (j = 0; i < col; j++) {
//              ^^^^^^^           It should be 'j < col'
0 голосов
/ 17 февраля 2020

Как было отмечено в комментариях, это не двумерный массив, а одномерный массив указателей. Также во втором случае для l oop вы случайно используете i<col вместо j<col. Это будет работать

#include<stdio.h>

#define ROW 2
#define COL 3

int main(){
    int a[ROW][COL];
    int i, j;

    for(i = 0; i < ROW; i++){
        for(j = 0;j < COL; j++){
            printf("Enter a(%d,%d)", i, j);
            scanf("%d", (*(a + i ) + j));
        }
    }
    return 0;
}
...