2012-04-13 4 views
0

Für diesen CodeGibt es eine Rolle von printf bei der Speicherzuordnung?

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
int i, j, k, l; 
int *ii = (int *)malloc(sizeof(int)); 
int *jj = (int *)malloc(sizeof(int)); 
int *kk = (int *)malloc(sizeof(int)); 
int m, n, o, p; 
// Call below line as star line 
printf("%u %u %u %u %u %u %u %u %u %u %u\n",&i,&j,&k,&l,&ii,&jj,&kk,&m,&n,&o,&p); 
// Call below line as delta line 
printf("%u %u %u %u %u %u %u %u %u %u %u\n",&i,&j,&k,&l,ii,jj,kk,&m,&n,&o,&p); 
return 0; 
} 

Ich bekomme diese Ausgabe

2293516 2293512 2293508 2293504 2293500 2293496 2293492 2293488 2293484 2293480 2293476 
2293516 2293512 2293508 2293504 3739288 3739320 3739336 2293488 2293484 2293480 2293476 

Alles bis jetzt klar ist, aber wenn ich die Sterne-Line-Ausgang wird

2293520 2293516 2293512 2293508 4525720 4525752 4525768 2293504 2293500 2293496 2293492 

Meine Frage ist, warum kommentiert In diesem Fall sind die Speicherorte nicht zusammenhängend. In der zweiten Zeile des ersten Falles hatten die Werte eine reguläre Differenz von 4 Bytes, dh 516, 512, 508, 504 und dann drei Stellen und dann 488, 484, 480 ... aber im zweiten Fall sind die Werte 520, 516, 512, 508 und dann drei Orte und dann 504, 500, 496. Warum ist hier der nächste Wert nach 508 504, während es 492 sein sollte? Gibt es hier eine Rolle von printf?

+0

Haben Sie den Adressoperator im zweiten Druck für ii, jj, kk vergessen? – thumbmunkeys

+0

@pivotnig: Nein, es ist beabsichtigt. –

+3

Ich denke, es hängt nur von Ihrem Compiler ab. Müssen Sie das wirklich kontrollieren? –

Antwort

2

Der Compiler ist frei, um lokale Variablen im Speicher anzuordnen, wie es ihm passt.

Es kann nicht garantiert werden, dass lokale Variablen zusammenhängend gespeichert werden oder dass zwischen ihnen keine ungenaue Auffüllung vorhanden ist oder dass sie in einer bestimmten Reihenfolge im Speicher gespeichert sind.

Es gibt auch keine Garantie, dass eine lokale Variable tatsächlich zur Laufzeit überhaupt existiert. Wenn Sie zum Beispiel die erste printf auskommentieren, werden die lokalen Variablen ii, jj und kk niemals als lvalues ​​ verwendet (Sie tun grundsätzlich nichts, was die Adresse der Objekte erfordert), sodass der Compiler die Eliminierung wählen kann diese Variablen vollständig.

In einem bestimmten Beispiel könnte ein Compiler entscheiden, alle drei Variablen an der gleichen Stelle im Speicher zu speichern, oder - da Sie die Variablen niemals initialisieren, kann er einfach den zufälligen Inhalt eines anderen Speicherplatzes verwenden. das wäre gleich "gültiges" Verhalten.

+0

Noch mehr, der Compiler kann zwei lokale Variablen an den gleichen Stapelspeicherort setzen, wenn er beweisen kann, dass sie sich nie einmischen. –

+0

Also im ersten Fall ist es zufällig, dass alle Werte zusammenhängend sind? –

+0

'zufällig' ... Lesen Sie die Quelle Ihres Compilers, dann entscheiden Sie selbst :) –

Verwandte Themen