Codeblocks 20.03 C/C++ zagadka z const
Ostatnio zmodyfikowano 2023-05-31 17:09
aksen Temat założony przez niniejszego użytkownika |
Codeblocks 20.03 C/C++ zagadka z const » 2022-09-21 00:02:56 kod w jezyku c: #include <stdio.h>
int main() { const int i = 10; int * p =( int * ) & i; * p = 5; printf( "i=%d, *p=%d\n", i, * p ); return 0; }
po skompilowaniu otrzymujemy na ekranie: i=5, *p=5 (a więc wszystko sie zgadza) kod w języku C++: #include <iostream>
using namespace std;
int main() { const int i = 10; int * p =( int * ) & i; * p = 5; cout << "i = " << i << ", *p = " << * p << endl; return 0; }
po skompilowaniu otrzymujemy na ekranie: i = 10, *p = 5 dlaczego 'i' nie jest równe 5??? |
|
DejaVu |
» 2022-09-21 12:10:51 Strzelam, że kompilator po prostu const-a bezpośrednio wstawił wartość 10 w 'printf'a, ale i tak robienie takich haków jest bardzo złe. Coś co jest constem, ma być zawsze constem. |
|
pekfos |
» 2022-09-21 16:59:36 Zmiana stałej przez takie tricki ma niezdefiniowane zachowanie. Kompilator ma prawo założyć, że stała się nie zmieni i jeśli wartość jest znana w czasie kompilacji, wstawić wartość prosto w miejsce użycia. Jak widać GCC to robi nawet przy -O0. Jeśli zrobisz z tej stałej "zmienną" globalną, program się najpewniej wysypie przy próbie zmiany wartości. Globalne stałe mogą trafić do sekcji tylko do odczytu i próba zapisu wywoła błąd ochrony pamięci. |
|
Jonny123 |
» 2023-05-31 17:06:18 Post usunięty przez moderatora |
|
Jonny123 |
» 2023-05-31 17:09:18 Post usunięty przez moderatora |
|
« 1 » |