Stack fuer Noobs
-
Hallo,
Ich habe ein kleines Verstaendnissproblem.Ich habe mal dieses Fragment implementiert, um zu schauen, wie diese
Arrays auf dem Stack abgelegt werden.int main() { char data2[10]; strcpy(data2,"YYYYYYYYYY"); char data[10]; strcpy(data,"XXXXXXXXXX"); char* p = &data[0]; int i; for(i=0;i<30;i++) { printf("%x\t%d\t%c\t\%d\n",p,p,*p,*p); p++; } return 0; }
Nun kommt folgendes dabei heraus:
22ff50 2293584 X 88<--- data[0]
22ff51 2293585 X 88
22ff52 2293586 X 88
22ff53 2293587 X 88
22ff54 2293588 X 88
22ff55 2293589 X 88
22ff56 2293590 X 88
22ff57 2293591 X 88
22ff58 2293592 X 88
22ff59 2293593 X 88<--- data[9]
22ff5a 2293594 0
22ff5b 2293595 0<--- ende speicher für data[] (3 x 4 byte)
22ff5c 2293596 8 -------------------
22ff5d 2293597 0 woher diese Lücke ?
22ff5e 2293598 0
22ff5f 2293599 0 -------------------
22ff60 2293600 Y 89<---data2[0]
22ff61 2293601 Y 89
22ff62 2293602 Y 89
22ff63 2293603 Y 89
22ff64 2293604 Y 89
22ff65 2293605 Y 89
22ff66 2293606 Y 89
22ff67 2293607 Y 89
22ff68 2293608 Y 89
22ff69 2293609 Y 89<---data2[9]
22ff6a 2293610 0
22ff6b 2293611 0<---ende bereich data2[]
22ff6c 2293612 ?-88
22ff6d 2293613 -1Soweit sogut, nun versteh ich aber nicht, wieso so eine grosse Luecke zwischen den Arrays ist. Normalerweise müssten die doch direkt hintereinander stehen.
Da nur ganze Wörter (32 bit) auf den Stack gepusht werden, sollte ein 10 byte char array eigentlich nur 12 byte belegen, bei mir sind es aber 16 ?!? Ich benutze den GCC Kompiler auf Win32.
Bei einer Arraygroesse von 4 liegt 1 byte zwischen den Arrays. Baut der Kompiler da einen Sicherheitsabstand ein ?
-
Der GCC nutzt immer Potenzen von 2 als Array-Größen (1, 2, 4, 8, 16, 32, usw). Wenn du also 17 Byte anforderst, hast du im Speicher 32 Byte. Deshalb ist es üblich, dass man Array-Größen direkt schon als Zweierpotenz angibt (also 16 statt 10).
yusha schrieb:
Bei einer Arraygroesse von 4 liegt 1 byte zwischen den Arrays. Baut der Kompiler da einen Sicherheitsabstand ein ?
Nein, nach 4 Byte gibt es keinen Abstand. In deinem Beispiel sieht das für dich so aus, da du strcpy() benutzt. Dem String wird dann ein Nullbyte angehängt, dass mitkopiert wird. Daher wird dann das erste Byte des folgenden Arrays überschrieben und daher wohl die vermutete Lücke nach 4 Byte.
Ich würde deshalb eher strncpy() benutzen, da du damit kontrollierst, wieviele Byte tatsächlich kopiert werden, z.B. strncpy(data, "XXXX", 4);. So werden wirklich nur 4 Byte in den Speicher geschrieben.
-
Hallo,
Soweit sogut, nun versteh ich aber nicht, wieso so eine grosse Luecke zwischen den Arrays ist... Baut der Kompiler da einen Sicherheitsabstand ein ?
Der Compiler hat, wie es aussieht, die beiden Arrays "16 Byte aligned" angelegt, d.h. die Anfangsadressen der Arrays sind durch 16 ohne Rest teilbar. Dadurch kann der Prozessor auf die Arrays effizienter zugreifen. Es ist also kein Sicherheitsabstand, sondern eine Art vom Compiler durchgeführte Optimierung...
Gruß,
abc.c