Привет сообщество stackoverflow, я изучал указатели в C ++.Я немного разбираюсь в golang и python, но не в C или C ++, так что простите меня из-за моего неправильного понимания.Позвольте мне опубликовать кусок кода, который работает нормально и дает segfault.
Этот печатает 5
int var = 5;
int *p = &var;
cout << *p << endl;
Этот также печатает 5
int *p;
p = &var;
cout << *p << endl;
печатает 5
(потому что p - указатель на int, а адрес var - указатель на int.).
Однако,
Этот segfaults.
int *p;
*p = var;
cout << *p << endl;
, который, как я предполагаю, происходит, потому что я присваиваю целочисленную переменнуюна переменную, которая должна быть указателем на целое число.Почему он не показывает ошибку несовместимого типа во время компиляции, а не дает ошибку сегментации?Что пытается сделать программа, которая дает ошибку сегментации, и как?
и
Этот также segfaults
int *p;
*p = 5;
cout << *p << endl;
также генерирует segfault.Насколько я понимаю для приведенного выше кода, я объявил указатель на int, и я присваиваю целочисленное значение разыменованному указателю на целое число, но поскольку переменная не инициализирована, компилятор не назначил память в стекедля хранения значения (что-то вроде поведения висячего указателя?) Если это причина, почему она выдает ошибку сегментации, причиной этой ошибки является доступ к памяти вне досягаемости программы?
- Еслипеременная объявляется только и не инициализируется, компилятор полностью игнорирует имя переменной и рассматривает его как несуществующее имя переменной?
Спасибо.