Dziwne zachowanie programu

0

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ę?]

4

Twój kod ma UB w wielu miejscach, ale próba zapisu w losowe miejsce w pamięci to prawie gwarantowany segfault. Nie rób tego, bo to nie ma żadnego praktycznego zastosowania.

0

UB?
Wydaje mi się, że nie zapisuję do pamięci nic w losowe miejsca?

3
 int zmienna = 10;
 int *wskaznik;
 *wskaznik = zmienna;

Gdzie zapisałaś wartość 10?

1 użytkowników online, w tym zalogowanych: 0, gości: 1