С ++ scanf вызывает SIGSEGV - PullRequest
       16

С ++ scanf вызывает SIGSEGV

1 голос
/ 01 февраля 2012

, когда я пытаюсь присвоить значения динамическому массиву с помощью функции scanf, я получаю эту ошибку «Сигнал получен: SIGSEGV (Ошибка сегментации)» после первого назначения, но когда я использую cin, он работает, и все значения назначаются правильно,Зачем?Проблема в моем коде?

int main(int argc, char** argv) {
int r = 5;

short* pole[r];


for(int x = 0;x<r;x++){
    pole[x] = new short[r];
    for(int y = 0;y<r;y++){
        scanf("%d",pole[x][y]); //error
        //cin >> pole[x][y]; //OK
    }
}

}

Ответы [ 4 ]

4 голосов
/ 01 февраля 2012

Вам не хватает амперсанда, и %d должно быть %hd (для short int):

scanf("%hd",&pole[x][y]);

Ваша исходная версия проходила значение изpole[x][y], тогда как scanf() ожидает указатель .Кроме того, спецификатор типа (%d) был неправильным для типа &pole[x][y].

3 голосов
/ 01 февраля 2012

Вы должны использовать

scanf("%d",&pole[x][y]);

как scanf () ожидать адрес переменной для записи в.

Также обратите внимание, что вы используете числошорт, но вы читаете целые числа.Вместо этого используйте% hd.

1 голос
/ 01 февраля 2012

В случае, если вам интересно, почему он вообще компилируется, это потому, что scanf совершенно не типизирован, поскольку после первого аргумента он принимает список переменных параметров (...).

Это означает, что вы можете передать все, что захотите, и это будет просто "надежда на лучшее", то, что вы хотели.

Это должен быть указатель, но он откатит 4 или 8 байтов от стека, и все, что находится в нем, будет считаться указателем, и оно будет пытаться читать из него.

Учитывая, что это C ++ (вы использовали new, а не malloc), могу ли я предложить вам использовать библиотеку C ++ и не использовать scanf. Используйте вектор желательно, а не массивы. Используйте матричный класс, если вам нужна матрица, и вы можете использовать iostream или подобное для выполнения чтения входных данных.

0 голосов
/ 01 февраля 2012

Конечно, вы получаете ошибку сегментации. scanf() запрашивает указатель на переменную, вы передаете значение.

scanf("%d",&pole[x][y]);
...