2013-02-16 23 views
7

Wiem: char * to wskaźnik do char. i int * to wskaźnik do int.Czy rozmiar znaku * jest taki sam jak rozmiar int *?

Tak, chcę, aby potwierdzić następujące dwie rzeczy:

  1. Więc teraz załóżmy, jestem na 32-bitowym komputerze, to znaczy adresy pamięci są 32 bitowe. Oznacza to, że rozmiar znaków char * i int * to 32 bity (4 bajty), prawda? Również rozmiar znaku * * jest taki sam jak rozmiar int *?

  2. Załóżmy, że mam: int * ptr;

Zatem teraz robi * ((char * *) = 0x154 PTR) jest taka sama jak * ((int *) ptr) = 0x514 samo, prawda? (0x514 to po prostu dowolny losowy adres pamięci)

Platforma: Jestem na x86.

P.S .: Wiem, że odlewanie typu nie jest sugerowanym sposobem kodowania. Ale robię kodowanie Kernela, więc MUSZĘ wykonać casting!

+0

Nawet jeśli standard tego nie mówi, wątpię, czy łatwo będzie znaleźć środowisko, w którym jest ono faktycznie inne. – Mysticial

+0

Chociaż ich rozmiar jest taki sam w praktyce, ich wymagania dotyczące wyrównania nie są takie same. – DCoder

+0

Jeśli robisz "kernel coding", to już ogranicza liczbę platform, na których można uruchomić kod. Sprawdź specyfikację systemu operacyjnego, co jest obsługiwane. –

Odpowiedz

11

W punktach C są not guaranteed to have the same size. Teraz w rzeczywistości większość wskaźników implementacji będzie tej samej wielkości, ale jest to szczegół implementacji kompilatora.

Z C Faq:

starej serii HP 3000 używa innego schematu adresowania dla bajt adresów niż dla adresów słownych; jak kilka maszyn powyższych dlatego wykorzystuje różne reprezentacje char * i void * wskaźniki niż w przypadku innych wskaźników

Zależnie od `` modelu pamięci „” w użyciu, procesory 8086-rodzinne (PC kompatybilne) może użyj 16-bitowych wskaźników danych i funkcji 32-bitowych wskaźników lub odwrotnie.

Również *((char *)ptr) = 0x154 to nie to samo co *((int *)ptr) = 0x154.Ponieważ wyłuskujesz wskaźnik, zapisujesz dane o rozmiarze char i rozmiarze int w lokalizacji wskazanej przez ptr. Zakładając 8-bitowy znak i 32-bitowy int, *((char *)ptr) = 0x154 zapisze 0x154 na adres pamięci przypisany do ptr, a *((int *)ptr) = 0x154 zapisze 0x0000000154 do 4 bajtów rozpoczynając od adresu przypisanego do ptr.

+0

Krótka odpowiedź, ale świetny link. Poleciłbym wstawić najciekawsze zdanie do twojej odpowiedzi, na przykład "Starsze, zorientowane na słowa maszyny Prime były również notorycznie wymagające większych wskaźników bajtów (char *) niż wskaźniki słów (int *)." –

+0

@ shf301 : Zmieniłem go na * ((char **) ptr) = 0x154. – user1599964

+0

@ user1599964 Zakładam, że był to literówka, podobnie jak różne wartości w twoim przykładzie - rzutowanie na 'char **' lub 'int *' oznacza bardzo różne rzeczy i nie są bezpośrednio porównywalne. Są na różnych poziomach pośrednictwa i nawet nie są blisko, robią to samo. – shf301

1

Technicznie rzecz biorąc, standard C gwarantuje tylko sizeof (char) == 1, a reszta zależy od implementacji. Ale na nowoczesnych architekturach x86 (na przykład układach Intel/AMD) jest to dość przewidywalne.

Prawdopodobnie słyszałeś procesory opisane jako 16-bitowe, 32-bitowe, 64-bitowe itd. Zwykle oznacza to, że procesor używa N-bitów dla liczb całkowitych. Ponieważ wskaźniki przechowują adresy pamięci, a adresy pamięci są liczbami całkowitymi, to skutecznie informuje o tym, ile bitów zostanie wykorzystanych na wskaźniki. sizeof jest zwykle mierzone w bajtach, więc kod skompilowany dla 32-bitowych procesorów będzie podawał rozmiar wskaźników do 4 (32 bity/8 bitów na bajt), a kod dla 64-bitowych procesorów zgłosi rozmiar wskaźników do 8 (64 bity/8 bitów na bajt). Tutaj dochodzi do ograniczenia 4 GB pamięci RAM dla procesorów 32-bitowych - jeśli każdy adres pamięci odpowiada bajtowi, aby adresować więcej pamięci, potrzebujesz liczb całkowitych większych niż 32-bitowe.

W praktyce wskaźniki będą miały rozmiar 2 w systemie 16-bitowym (jeśli można je znaleźć), 4 w systemie 32-bitowym i 8 w systemie 64-bitowym, ale nic nie da się zdobyć poleganie na danym rozmiarze

+0

Wszystko jest w porządku, dopóki nie natkniesz się na 36- lub 48-bitową architekturę, którą [komitet standardów również rozważył] (http://stackoverflow.com/questions/6971886/exotic-architectures-tand-committee-council-about). –

Powiązane problemy