Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Codeblocks 20.03 C/C++ zagadka z const

Ostatnio zmodyfikowano 2023-05-31 17:09
Autor Wiadomość
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:

C/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++:

C/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???

 
P-179640
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.
P-179642
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.
P-179643
Jonny123
» 2023-05-31 17:06:18
Post usunięty przez moderatora
P-180148
Jonny123
» 2023-05-31 17:09:18
Post usunięty przez moderatora
P-180149
« 1 »
  Strona 1 z 1