Es wird nicht in array[13]
übersetzt, aber richtig zu array[-2147483635]
. Dies kann jedoch immer noch zu undefiniertem Verhalten führen. Zum Beispiel auf 32-Bit-x86, die Montage für
char f(char * a) { return a[-2147483635]; }
int g(int * a) { return a[-2147483635]; }
könnte wie folgt aussehen:
f:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movzbl -2147483635(%eax), %eax
popl %ebp
ret
g:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 52(%eax), %eax
popl %ebp
ret
Online Beispiel here See. So sieht alles gut für das Array char
, aber Sie können den Überlauf für das Integer-Array (movl 52(%eax), %eax
wo 52 ist 4 × 13) sehen. Dies wird durch das nicht definierte Verhalten verursacht, da das Element mit dem Index -2147483635 auf 32-Bit-Systemen möglicherweise nicht für ein Array oder einen Zeiger existieren kann. Für Arrays würde auf ein Element vor dem ersten Element des Arrays zeigen, daher undefiniertes Verhalten. Für jeden Zeiger, wenn Sie nur maximal 2 oder 4294967296 Bytes Speicher haben und sagen wir, dass array
auf das letzte Byte bei Index 2 -1 oder 4294967295 zeigt, dann würde das -2147483635-te Element müssen sich an der Speicheradresse befinden, die 4294967295 - 8589934540
ist, die -4294967245
ist. Eine solche Speicheradresse macht keinen Sinn.
Siehe cppreference oder die C-Norm in § 6.5.6 (8) für Details.
Warum glaubst du, es übersetzt "zu Array [13]"? – jotik
Ich sehe Hexe Adresse es schreiben – jordan
Was ist der Typ von 'Array'? – jotik