Указатели C (всегда) начинаются с правильной адресной памяти?

1
задан Naive Developer 19 March 2019 в 15:51
поделиться

3 ответа

Нет. Неинициализированные локальные переменные имеют неопределенные значения, и использование их в выражениях, где они оцениваются, приводит к неопределенному поведению.

0
ответ дан machine_1 19 March 2019 в 15:51
поделиться

Указатель C (всегда) начинается с правильной памяти адресов?

No.

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

Код вызывает неопределенное поведение. Если кажется, что он работает в вашей конкретной системе с вашими опциями компилятора, это просто совпадение.

0
ответ дан sepp2k 19 March 2019 в 15:51
поделиться

Поведение не определено. Компилятор переменного тока может оптимизировать доступ к указателю, отмечая, что в факте не используется p, только объект *p, и заменить *p на q и эффективно создать программу, которая соответствует этому исходному коду:

#include <stdio.h>

int main(void) {
    int q = 5;
    printf("%i", q); //shows 5
}

Таков случай, когда я компилирую программу с GCC 7.3.0 и переключателем -O3 - без сбоев. Я получаю сбой, если скомпилирую без оптимизации. Обе программы соответствуют стандарту интерпретации кода, а именно то, что разыменование указателя, который не указывает на допустимый объект, имеет неопределенное поведение .

0
ответ дан Antti Haapala 19 March 2019 в 15:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: