Нет. Неинициализированные локальные переменные имеют неопределенные значения, и использование их в выражениях, где они оцениваются, приводит к неопределенному поведению.
Указатель C (всегда) начинается с правильной памяти адресов?
blockquote>No.
Почему этот код работает?
blockquote>Код вызывает неопределенное поведение. Если кажется, что он работает в вашей конкретной системе с вашими опциями компилятора, это просто совпадение.
Поведение не определено. Компилятор переменного тока может оптимизировать доступ к указателю, отмечая, что в факте не используется p
, только объект *p
, и заменить *p
на q
и эффективно создать программу, которая соответствует этому исходному коду:
#include <stdio.h>
int main(void) {
int q = 5;
printf("%i", q); //shows 5
}
Таков случай, когда я компилирую программу с GCC 7.3.0 и переключателем -O3
- без сбоев. Я получаю сбой, если скомпилирую без оптимизации. Обе программы соответствуют стандарту интерпретации кода, а именно то, что разыменование указателя, который не указывает на допустимый объект, имеет неопределенное поведение .