Po kolei:
1. Deklaracja zmiennych jest prawie OK. Dobrą praktyką jest nadawanie zmiennym wartości w chwili deklaracji. Nie robisz tego dla tab
. Możesz zmienić to w jedną linijkę.
2. Alokacja pamięci powinna określać typ wartości jakie będą przechowywane oraz rozmiar tej pamięci. Jeśli gdzieś na necie widzisz zapis n * sizeof( typ )
, to oznacza, że ktoś tworzy tablicę, o rozmiarze n
. Ty chcesz jedną wartość, zrób więc to, co kolega @lion137 w funkcji malloc
.
3. Piszesz, że:
Program powinien wyświetlić: 3.141593 0x2137010
skąd taka pewność co do adresu zmiennej pi
? Nie masz żadnej gwarancji i żadnej pewności gdzie zostanie ona utworzona tym bardziej, że dajesz ją na stos.
Po drugie, jeśli chcesz wyświetlić wartość w formacie heksadecymalnym, to używasz %x
lub %p
4. Jeśli chcesz wyświetlić adres zmiennej zaalokowanej czyli w Twoim przypadku tab
, to nie rób tego tak, jak pokazał @lion137, ale zrób to bez znacznika &
.
Czyli:
printf("%f, %p\n", *t, t);
Rzecz w tym, że wskaźnik (a dokładnie jego wartość) już jest adresem zmiennej, na który wskazuje. Więc nie musimy pobierać jeszcze jego adresu.