2012-11-03 3 views
4

Можно создать дубликат:
constants and pointers in CConst в C дает непредсказуемым результатам

У меня есть этот маленький кусочек кода. Я использую GCC компилятор:

#include <stdio.h> 

int main() 
{ 
    const int a=10; 
    int *d; 
    d=&a; 
    *d=30; 
    printf("%d %d\n",a,*d); 
    return 0; 
} 

Это дает предупреждение о компиляции:

"назначение отбрасывает отборочные от целевого указателя типа"

Но никакой ошибки. Выходной сигнал: 30 30

Тогда он не оспаривает цель поддержания константной переменной, значение которой фиксировано во время выполнения программы (пожалуйста, исправьте меня, если я ошибаюсь)?

+3

Еще одна причина, по которой на самом деле не игнорировать предупреждения. Ваш код никоим образом не работает _guaranteed_. На самом деле, я бы сказал, что вам повезло, что он не разбился и не сгорел :) –

+1

Обратите внимание, что ответ на дубликат немного разряжен по стандарту, который не говорит о «readonly memory», только то, и не является (это не так). Компилятор должен решить, где находится 'a'. Неопределенное поведение не означает, что «произойдет ошибка». Это будет определено поведение. –

+0

Как сказал @JoachimIsaksson, это неопределенное поведение. Пожалуйста, сделайте достаточно исследований, прежде чем задавать вопросы о stackoverflow. – CCoder

ответ

4

const не является гарантией. Это только обещание. Обещания могут быть нарушены. Компилятор предупреждает, когда это происходит, но в противном случае не требуется его предотвращать, поскольку могут быть случаи, когда обход константы может быть полезен.

0

Вы не должны этого делать, и компилятор дает вам это предупреждение по какой-либо причине. Однако C/C++ позволит вам делать все, что угодно. Вы должны написать чистый код.

Вы можете отразить константность этого значения с помощью:

int const * d = &a;  

Затем, изменяя то, что г указывает на произведут предупреждения и ошибки.

2

Указанное поведение не определено. Как показывает пример this, вы можете получить и другие значения. Объяснение для этого вывода: компиляторы оптимизируют код и заменяют константные переменные своими значениями. Таким образом, мы можем видеть разницу, когда мы делаем printf("%d %d %u %u\n",a,*d,&a,d);, которая была бы фактически изменена для оптимизации, поскольку printf("%d %d %u %u\n",10,*d,&a,d);

Не полагайтесь ни на один из этих выходов. Фактическое поведение не определяется стандартом.

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