Zamiana wskaźnika i niepoprawny wynik w konsoli

0

Dlaczego potem wskaźnik wd nie wyświetla też x ?

#include <iostream>
using namespace std;

int main()
{
	char obj = 'x';
	char *wch1;
	char *wch2;
	double *wd;

	wch1 = &obj;
	wch2 = wch1;
	wd = (double *)wch2;
	cout << *wch1 << endl << *wch2 <<  endl << static_cast<char>(*wd) <<endl;

	system("pause");

} 
2

Bo double jest większe od chara? Zobacz co zrobiłeś! Zrzutowałeś chara na double i zrobiłeś dereferencje (za co powinieneś spłonąć w piekle) czyli mamy UB i odwołanie się poza poprawnym obszarem pamięci, bo dereferencja łyknęła sizeof(double) bajtów a nie sizeof(char). Żeby to zadziałało "poprawnie" musiałbyś zrobić rzutowanie do char* a dopiero potem derefefencje.

2

To co tutaj robisz to UB w dwóch miejscach:

  1. Wrzucasz do streama wch2 jako cstring, pomimo, że wskazuje on na 1 element.
  2. Dokonujesz dereferencji wd, pomimo, że nie wskazuje on na double.

Co się najprawdopodobniej dzieje¹: wynikiem tego działania będzie odczyt śmieciowych danych zaraz za obj na stosie jako double. Ta odczytana wartość jako liczba zmiennoprzecinkowa zostaje zamieniona na char, czyli liczbę z zakresu [-128,127], a następnie przedstawiona jako znak o odpowiednim kodzie tablicy znaków Twojego locale o uzyskanym numerze.

Być może miałeś na myśli poniższe?

cout << *reinterpret_cast<char*>(wd)

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