const int a = 10
int *p = (int*) &a;
*p = 20;
printf("a = %d", a);
Czy można wyprowadzić 10 lub 20, w zależności od kompilatora?może odrzucić ciąg stałości do niezdefiniowanego zachowania?
const int a = 10
int *p = (int*) &a;
*p = 20;
printf("a = %d", a);
Czy można wyprowadzić 10 lub 20, w zależności od kompilatora?może odrzucić ciąg stałości do niezdefiniowanego zachowania?
Kiedy robisz *p=20
, próbujesz zmienić wartość stałej, co jest niedozwolone.
Czy można wyprowadzać 10 lub 20, w zależności od kompilatora?
Tak, mogą pojawić się nawet demony nosowe. Zachowaniem tego programu jest niezdefiniowana, kod jest źle sformułowany, ponieważ modyfikowanie obiektu const
jest naruszeniem ograniczeń.
+ dla "naruszenia ograniczeń" jest wywołane const-constraint - lubię poprawne terminologie . –
@GrijeshChauhan Niepowiązane: dzięki za linki dupe. –
@ H2CO3 Wiele razy czytałem te odpowiedzi. W przeszłości miałem takie samo zamieszanie. właściwie pytanie jest dobre i oczywiste. –
Jak napisano, Twój kod ma niezdefiniowane zachowanie, więc tak, możesz uzyskać 10 lub 20 lub cokolwiek innego (np. Naruszenie dostępu).
To niezdefiniowane zachowanie:
C11 6.7.3 Rodzaj kwalifikacyjne
Jeśli nastąpi próba modyfikacji obiektu zdefiniowane z typem const wykwalifikowana poprzez wykorzystanie z lwartością z const -kwalifikowany typ, zachowanie jest niezdefiniowane. Jeśli próba jest wykonana na obiekcie zdefiniowanym za pomocą typu z lotnością kwalifikowaną, przy użyciu wartości LV z typem nieulotnym, zachowanie jest niezdefiniowane.
Tak, to jest niezdefiniowane zachowanie, i myślę, że to jest to, co mówi o tym.
C99 6.7.3 Punkt 5
Jeżeli próbuje się zmodyfikować przedmiotu zdefiniowanego w const wykwalifikowana rodzaju dzięki zastosowaniu lwartością z const wykwalifikowana typu, zachowanie jest niezdefiniowane. Jeśli próbuje się odnosić do obiektu zdefiniowanego z rodzajem ulotnej wykwalifikowana poprzez wykorzystanie lwartością z nieulotną wykwalifikowanej typu zachowanie jest undefined.115)
niezdefiniowane zachowanie – minicaptain
dałem swoje zakwestionuj tytuł podsumowujący jego treść. Nie używaj tak ogólnych tytułów jak oni, nikomu nie pomagają. –
@Jens Gustedt OK. Dzięki. – xiaokaoy