Поведение указателя дает значение как 1 - PullRequest
0 голосов
/ 26 августа 2018

Чтобы было ясно, я знаю о указателе на концепцию указателя в C и разыменовании двойных, тройных указателей. Единственное сомнение у меня в следующей программе, которую я написал:

#include<stdio.h>
int main(){
    int a;
    int* p;
    a=5;
    p=&a;
    int **q;
    printf("*p=%d\n",*p);
    printf("*q=%d\n",*q);
}

Теперь я знаю, что программа довольно глупая и не имеет смысла, но это не проблема. Вопрос ПОЧЕМУ? Почему вывод такой:

*p=5
*q=1

Почему * q = 1 при каждом запуске? Также стоит иметь в виду, если я сейчас объявлю *** р; И добавьте следующую строку:

printf("*r=%d\n",*r);

Теперь вывод:

*p=5
*q=-40821602 //garbage
*r=1

Теперь * r = 1. ЗАЧЕМ? То же самое касается **** s. В этом случае * q, * r - мусор, а * s = 1. Почему?

1 Ответ

0 голосов
/ 27 августа 2018

Оценка неинициализированного указателя - неопределенное поведение, и это то, что вы сделали. cppreference сообщает следующее о неопределенном поведении:

Неопределенное поведение :

  • неопределенное поведение - нет ограничений на поведение программы. Примерами неопределенного поведения являются обращения к памяти за пределами границ массива, целочисленное переполнение со знаком, разыменование нулевого указателя, модификация одного и того же скаляра в выражении без точек последовательности, доступ к объекту через указатель другого типа и т. Д. Компиляторы не требуется диагностировать неопределенное поведение (хотя диагностируется много простых ситуаций), а скомпилированная программа не обязана делать что-либо значимое.

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

Так что вопрос «почему?» просто не верный вопрос.

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