2016-10-29 4 views
-3

Мой вопрос: почему изменяется значение переменной a, хотя я объявил его как const? Извините, если это тривиальный вопрос.Const не const?

const int a = 8; 
int* ptr = &a; 

printf("variable: %d \n", a); 
printf("pointer: %d \n", *ptr); 

*ptr = 1; 
printf("pointer: %d \n", *ptr); 
printf("variable: %d \n", a); 

Выход: 8 8 1 1

Спасибо и хорошего дня!

+0

Итак, вы спрашиваете, почему код беспорядков, если ** вы ** разорвать контракт ** вы ** гарантированно? Но ваш компилятор должен был предупредить, по какой причине вы проигнорировали это? Примечание: C не имеет символических констант, кроме _enum-constants_. – Olaf

+0

Вообще говоря, стандарт C-языка разрешает кастинг от «указателя на const» до «указателя на неконстантный», поэтому точное поведение программы во время выполнения не определено. Более конкретно, поведение во время выполнения этой программы зависит от компилятора. Если компилятор выделяет константные переменные в сегменте только для чтения исполняемого изображения, тогда при выполнении строки '* ptr = 1' вы получите нарушение доступа к памяти (aka * segmentation fault *). Если он выделяет их в сегменте чтения-записи исполняемого изображения, то эта строка будет выполнена успешно. –

ответ

0

Вы квалифицированы a как const, но при назначении его адрес указателю, отбрасывается эффект const и a теперь можно легко манипулировать с помощью ptr. Это, скорее всего, вызывает неопределенное поведение.

НКУ покажет предупреждение при компиляции программы:

warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] 
     int* const ptr = &a; 

Если вы хотите, чтобы не испытать этот эффект, объявить переменную указатель, как указатель на константу. Пример: const int* ptr=&a;

+0

Почему downvote? – skrtbhtngr

+0

Удивительно! Ваш ответ правильный. Вы должны сказать, что это поведение не определено ... –

+0

Да, я отредактировал его после публикации. – skrtbhtngr

Смежные вопросы