2016-04-16 16 views
0
int meta_size = 24; 
    node_t* prev; 

    printf("%lx, ", prev + meta_size); 
    printf("%lx, ", prev); 
    printf("%lx, ", meta_size); 

output: 1519240, 1519000, 18 wie das passiert?Addition von unsigned long und int in C

+2

gedruckt hast du erwartet? Sie verwenden den falschen Formatbezeichner, um einen Zeiger zu drucken, der undefined baheviour aufruft. Und trotz Ihres Titels fügen Sie kein 'unsigned long' und ein' int' hinzu. – Olaf

+0

Nasendämonen? .. –

+1

Verstehen Sie [hexadezimal] (https://en.wikipedia.org/wiki/Hexadecimal) Zahlen? – user3386109

Antwort

2

Prev ist ein unitialised Zeiger erhalten wird, enthält (eine zufällige, denn es ist nicht initialisiert) Speicheradresse.

printf("%lx, ", prev + meta_size);//Prints the memory address prev is pointing to + (sizeof(node_t) * meta_size) 
printf("%lx, ", prev);    //Prints the memory address prev is pointing to 
printf("%lx, ", meta_size);  //Prints meta_size, 18 is 24 in hexidecimal, because of the 'x' in %lx 

jedoch die ersten zwei Zeilen sind nicht definiertes Verhalten, weil Zeiger sollten Was mit% p

+0

prev is initialisiert. Ich habe es einfach nicht gezeigt. – canbax

0

wenn Sie sizeof(node_t) tun bin ich ziemlich sicher, dass Sie 10.

+1

Eigentlich '24' Dezimal oder' 0x18' Hex. Beachten Sie, dass alle Ausgabenummern Hex sind. – user3386109

+0

ja du hast Recht. Wenn Sie n zu einem node_t-Zeiger hinzufügen, wird die Zeigeradresse um n * (sizeof (node_t)) erhöht. Deshalb wird sie in Basis 16 = 576 in Basis 10 = 24 * 24 in Basis 10 um 240 erhöht. – canbax