C указатель вопрос, разыменование сбой - PullRequest
1 голос
/ 24 мая 2010

Почему это работает?

    int *var;

while(scanf("%d", &var) && *var != 0)
        printf("%d \n", var);

Пока этого нет?

    int *var;

while(scanf("%d", &var) && var != 0)
    printf("%d \n", var);

Не * (оператор разыменования) дает вам значение, указанное указателем? Так почему же * var! = 0 завершает работу программы, а var! = 0 - нет?


Это сработало:

int* var = malloc(sizeof(int));

while(scanf("%d", var) && *var != 0)
    printf("%d \n", *var);

Прохожу курсы повышения квалификации на C, рад, что я это сделал.

Я понял, что scanf (& var) для обычных переменных, а scanf (var) для указателей. Но совсем забыл про память, спасибо!

Ответы [ 4 ]

3 голосов
/ 24 мая 2010

Я не уверен, что вы подразумеваете под "работами", но первое неверно, потому что вы берете то, на что указывает var, и сравниваете его с нулем в первом примере, и так как var был инициализирован как пользователь Введено, на что указывает var, вероятно, не является допустимым местом.

*var != 0

Принимает значение, указанное пользователем var.

Обратите внимание, что в scanf вы сканируете целое число в int **, а не в int *, и printf использует% d для печати указателя, а не целое число.

Может показаться, что все работает или не работает, когда вы делаете неопределенные вещи по разным причинам. Вы должны понимать, почему код, который вы пишете, является правильным, вместо того, чтобы записывать некоторый код и изменять его до тех пор, пока он не заработает.

0 голосов
/ 24 мая 2010
(1) int i; // reserves an integer
(2) scanf("%d",&i); // writes to the address of i
(3) int *var; // is a pointer pointing to some unpredictable place 
(4) int *var = &i; // would point exactly to the adress of i
(5) scanf("%d",var) // would be the same as (2)
0 голосов
/ 24 мая 2010

В обоих случаях вы передаете scanf() адрес int, где строка формата заставляет его ожидать int.
Поэтому я бы сказал , что они оба вызывают неопределенное поведение . То, что первый выходит из строя, а второй нет, - это только один из многих способов, которыми это может проявиться. С таким же успехом это может быть и наоборот, или и то, и другое, или нет, или нет, кроме случаев, когда ты не смотришь или в полнолуние. Неопределенное поведение делает все это и многое другое.

0 голосов
/ 24 мая 2010

Вы передаёте int * в sscanf, а не int **. Удалите * из первого объявления или инициализируйте его как что-то вроде malloc (sizeof (int)) и удалите & из вызова sscanf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...