2016-08-14 3 views
-2

Mein Lehrbuch hat eine Frage, was die Ausgabe des folgenden Code-Schnipsel sein wird, fragt:Warum ist das die Ausgabe des Zeigers?

#include<stdio.h> 

int main() 
{ 
    int arr[3] = {2, 3, 4}; 
    char *p; 
    p = arr; 
    p = (char*)((int*)(p)); 
    printf("%d, ", *p); 
    p = (int*)(p+1); 
    printf("%d", *p); 
    return 0; 
} 

Optionen:

A. 2,

B. 2, 3 0

C. 2, Garbage Wert

0 D., 0

Nach dem Lehrbuch ist die Antwort B, aber ich bin verwirrt - kann jemand erklären warum?

+0

Also, was ist los? Was hast du erwartet? Was hast du versucht, das selbst zu beantworten? Was sagt dein Lieblings-C-Buch? Was ** speziell ** darüber verstehst du nicht? Hast du ** irgendetwas ** versucht, bevor du fragst? – Olaf

+0

Bei dieser Art von Frage kann es sehr schwer sein, genau zu bestimmen, was genau man nicht versteht und noch schwerer herauszufinden, nach welchen Keywords gesucht werden soll. Das Lernen der Gesamtheit der C-Sprache würde offensichtlich immer noch ihre Frage beantworten, scheint aber irgendwie unverhältnismäßig zu sein. Was * sollten * sie Ihrer Meinung nach versucht haben? –

Antwort

0

Warnung: Einige davon sind eher vereinfacht.

Es geht um Speicherlayout. Wenn Sie arr definieren, ist es eine Reihe von int und sieht wie folgt aus Speicher:

2, 3, 4

Aber jeder int ist (oder besser gesagt sein kann, ist C ein bisschen plattformabhängig .) vier char s lang. Also, wenn als ein Array von char betrachtet sieht es wie folgt aus:

2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0

Als p ist vom Typ char *, Hinzufügen von eins zu bringt Ihren Zeiger um eins wie in der zweiten Perspektive. Daher bekommst du diese Ausgabe.

+0

Nein, es handelt sich um ein undefiniertes Verhalten. – Olaf

+0

1) Haben Sie nicht einfach die Tatsache kommentiert, dass Sie nicht sicher sind, worum es bei der Frage geht? 2) Bitte erläutern. Auf welches undefinierte Verhalten beziehen Sie sich? –

+0

1) Warum würde das das Problem verändern? Übrigens. Ich habe nicht gesagt, dass die Frage unklar ist, sondern nur unklar ist, was OP ** speziell verlangt. Vielleicht möchten Sie Regeln für Fragen überprüfen. Apparnetly this ein anderer "Ich bin zu faul zum Fischen gehen, gib mir den Fisch" Frage. 2) Nun, es ist ** deine ** Antwort, wie wäre es mit dir selbst herauszufinden? – Olaf

Verwandte Themen