2017-11-26 1 views
-2

Ich bekomme eine unerwartete Ausgabe. Bitte sagen Sie mir, dass ich dis bekommen werde?Warum ist der Ausgang 2 und 0 für dieses Programm?

Code ist unten angegeben:

#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; 
    } 

Ausgang:

+0

In C ist char ein einzelnes Byte und int ist 4 Byte (oder 2 Byte). Denk darüber nach, was du tust. Was Sie tun, ist sehr verworren, wahrscheinlich weil jemand es speziell so entworfen hat, um den Punkt zu illustrieren. – realharry

+2

'p = (int *) (p + 1);' Hat undefiniertes Verhalten, denke über den Unterschied zwischen 'sizeof char' und' sizeof int' nach. – George

+0

Bitte schreiben Sie Englisch, n dis inkomprhnzbl tn sp33k! –

Antwort

1

Wie diese int arr[3] = {2, 3, 4} Anweisung in memory gespeichert werden? arr ist ein lokaler Variable und es wird in Stapel Abschnitt RAM gespeichert werden, übernimmt Startadresse ist 0x100

arr[0] arr[1] arr[2] 
    |--------------------| 
    | 2 | 3 | 4 | 
    |--------------------| 
    0x100  0x104 0x108 
    arr 
    p 

Als nächstes p = (char*)((int*)(p)); hier zuerst p in int pointer umgewandelt und später umgewandelt wieder in char pointer also noch p zeigt nur auf 1st byte.

Also, wenn Sie ausführen erste printf

printf("%d, ", *p); 

hier p ist char pointer und es wird holen, was die Daten in 0x100 zu 0x101 ist was 2 so druckt er 2

Als nächstes, wenn Sie dabei

p = (int*)(p+1); // here first p+1 will happen means 0x101 which is converted later into int pointer , but only in this statement(typecasting effect will be in this statement only . 

Wenn Sie den nächsten printf drucken, ist immer noch char pointer, also wird nur 1 byte data abgerufen, nicht 4 byte.

printf("%d", *p);// it will print what is the data in 0x101 ? it's 0 check the binary representation of array 

Testfall: wenn p = (int*)(p+1) innen printf geputtet haben könnte dann ergibt es unterschiedliche Ergebnisse, für beispiels

printf("%d\n",(int*)(p+1)) 

Ich hoffe, es hilft.

Verwandte Themen