Computer Hardware Forum - TweakPC

Computer Hardware Forum - TweakPC (https://www.tweakpc.de/forum/)
-   Programmiersprachen (https://www.tweakpc.de/forum/programmiersprachen/)
-   -   [C] So ne Sache mit nem void Pointer (https://www.tweakpc.de/forum/programmiersprachen/57478-c-so-ne-sache-nem-void.html)

MasterMito 01.07.2008 14:58

[C] So ne Sache mit nem void Pointer
 
Salut,

ich brüte hier vor nem Problem mit void-Pointern. Morgen ist Klausur und entweder ist der Prof der Honk (sehr wahrscheinlich) oder ich.

Wir haben ein char Feld auf das ein void-Pointer zeigt. Bsp:

[code]short int a[2] = {1,2};
void * vptr;
vptr = a;[/code]Ausserdem kommt noch ein [code]char * cpointer[/code] dazu dem die Adresse vom vptr zugewiesen wird.

[code]short int a[2] = {1,2};
void * vptr;
vptr = a;
cpointer = vptr;[/code]Gefragt ist die Ausgabe von:
1. sizeof(a) = %d; (das sind 4 Byte, das sollte klar sein)
2. sizeof(a[0]) = %d (das sind 2 Byte, immer noch alles bestens)
3. sizeof(cpointer) = %d (da gehts los, wie groß soll der denn sein, 4???)
4. *cpointer = %d (omg... wat will der Spack)
5. *(cpointer+1) = %d (der abschluss)

Prof hat keine Ahnung, faselt immer was von Little Endian, wobei mir da etwas der Zusammenhang fehlt.. 1-5 steht in nem tollen printf.

Need Help...
PS: google haben wir auch schon gefragt

Crystallion 01.07.2008 22:28

AW: [C] So ne Sache mit nem void Pointer
 
[quote=MasterMito;558223]Gefragt ist die Ausgabe von:
1. sizeof(a) = %d; (das sind 4 Byte, das sollte klar sein)
[/quote]
Richtig, das sind 4 Byte. Wenn Dir das klar ist, müsste Dir aber auch 3. klar sein.

[quote=MasterMito;558223]
2. sizeof(a[0]) = %d (das sind 2 Byte, immer noch alles bestens)
[/quote]
Stimmt auch, ein short int ist 16bit groß.

[quote=MasterMito;558223]
3. sizeof(cpointer) = %d (da gehts los, wie groß soll der denn sein, 4???)
[/quote]
Die gleiche Logik wie in 1.: cpointer ist vom Typ char*, also ein Pointer. Pointer sind in 32bit-Umgebungen normalerweise genau so groß, also 4 Byte.

[quote=MasterMito;558223]
4. *cpointer = %d (omg... wat will der Spack)
[/quote]
Das ist knifflig. Was vor dem '=' steht, heißt folgendes: "Interpretiere den Wert an der Speicherstelle cpointer [=vptr=a] als char".

Das heißt, es geht um die ersten acht Bit (weil char) des short int mit dem Wert 1.

Der lautet binär 1000000000000000 (hier kommt Little Endian ins Spiel, das niederwertigste Bit wird als erstes gespeichert), die ersten acht Bits sind also 10000000. So steht es im Speicher des Rechners.

In der gebräuchlichen Darstellung würde man das als Big Endian schreiben, nämlich 00000001. Interpretiert wird es in beiden Fällen einfach als eine 1, in dem Fall also als der Character mit der Nummer 1. Laut [URL="http://de.wikipedia.org/wiki/ASCII-Tabelle"]Wikipedia[/URL] ist das ein Steuerzeichen ("SOH").

Als Zeichen hat das keine Darstellung, der %d-Modifikator im printf gibt das aber einfach als "1" aus.

[quote=MasterMito;558223]
5. *(cpointer+1) = %d (der abschluss)
[/quote]
Hier wird cpointer zuerst um 1 inkrementiert. Da es ein char-Pointer ist, wird der Zeiger dadurch um acht Bit weitergeschoben - also auf die hinteren acht Bits des short ints '1' im Speicher, die da lauten 00000000.

Dann wird der verschobene Pointer dereferenziert und als char mit der Nummer 0 interpretiert. Das Zeichen hat keine Darstellung als ASCII-Zeichen, aber printf mit %d gibt es als 0 aus.


Hoffe das hilft Dir weiter. Wenn was unklar ist versuch ich's gern noch besser zu erklären.

MasterMito 02.07.2008 15:08

AW: [C] So ne Sache mit nem void Pointer
 
Alles bestens...Dickes merci... jetzt ist es klarer. Heute Klausur geschrieben wo das drin kam... natürlich gewusst ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:42 Uhr.

Powered by vBulletin® Version 3.8.10 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
SEO by vBSEO 3.5.2 ©2010, Crawlability, Inc.