Kompilator to: gcc version 9.2.1 20190827 (Red Hat 9.2.1-1) (GCC) (system Fedora 30)
Kod przed zmianą:
1 #include <iostream>
2
3
4 using namespace std;
5
6
7
8 int main() {
9 int zmienna = 10;
10 int *wskaznik;
11
12 cout << "Zmienna: " << zmienna << endl;
13 cout << "Wypiszę sobie zawartość wskażnika przed przypisaniem do czegokolwiek: " << *wskaznik << endl;
16 *wskaznik = zmienna;
17 cout << wskaznik << " <Wskaznik po przypisaniu/wskaznik na zmienna: > " << *wskaznik << endl;
18 cout << "Próbuję przypisać wskaznik = zmienna" << endl;
19 wskaznik = &zmienna;
20 cout << wskaznik << " <wskaznik : zmienna> " << zmienna << endl;
21 }
Kod po zmianie:
int main() {
9 int zmienna = 10;
10 int *wskaznik;
11
12 cout << "Zmienna: " << zmienna << endl;
13 cout << "Wypiszę sobie zawartość wskażnika przed przypisaniem do czegokolwiek: " << *wskaznik << endl;
14 for(int i = 0; i<1000000 ; i++) {//NIC
15 }
16 *wskaznik = zmienna;
17 cout << wskaznik << " <Wskaznik po przypisaniu/wskaznik na zmienna: > " << *wskaznik << endl;
18 cout << "Próbuję przypisać wskaznik = zmienna" << endl;
19 wskaznik = &zmienna;
20 cout << wskaznik << " <wskaznik : zmienna> " << zmienna << endl;
21 }
Polecenie kompilujące:
$ g++ wskazniki.cpp -o wskazniki
Wyniki działania programu, przed:
$ ./wskazniki
Zmienna: 10
Segmentation fault (zrzut pamięci)
Po zmianie:
$ ./wskazniki
Zmienna: 10
Wypiszę sobie zawartość wskażnika przed przypisaniem do czegokolwiek: 1
0x7ffcb1a505a0 <Wskaznik po przypisaniu/wskaznik na zmienna: > 10
Próbuję przypisać wskaznik = zmienna
0x7ffcb1a504ac <wskaznik : zmienna> 10
Wygląda to tak jakby program próbował wyprzedzić swoje działanie i wywoływał coś jeszcze zanim to powinien zrobić.
Od czego zależy zachowanie tego programu i czy to zachowanie jest normalne czy też jest to jakiś błąd kompilatora? Albo - co zrobiłam źle?
[tzn na pewno celowo i świadomie chciałam zobaczyć adres wskaźnika w pamięci, jednak nie powinno to wpłynąć na pierwsze linijki działania programu, które były napisane jeszcze "prawidłowo"
Czy może się mylę?]