array[13]
には翻訳されませんが、array[-2147483635]
に正しく変換されます。ただし、未定義の動作が発生する可能性があります。例えば、32ビットx86上で、
char f(char * a) { return a[-2147483635]; }
int g(int * a) { return a[-2147483635]; }
のためのアセンブリは、次のようになります。
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
は、オンライン例hereを参照してください。だから、char
配列はすべてよく見えますが、整数配列(movl 52(%eax), %eax
は52が4 × 13)のオーバーフローを見ることができます。 32ビットシステムでは、インデックスが-2147483635 の要素は、任意の配列またはポインタに対してが存在しない可能性があるため、未定義の動作が原因です。配列の場合、はで、配列の最初の要素の前のいくつかの要素を指すため、未定義の動作です。任意のポインタについて、最大値が2 または4294967296バイトのメモリしか持たず、インデックス -1または4294967295の最後のバイトを指しているとすると、-2147483635番目の要素は-4294967245
である4294967295 - 8589934540
であるメモリアドレス4294967295 + ((-2147483635)*sizeof(int))
に存在しなければならない。このようなメモリアドレスは意味をなさない。
詳しくは、cppreferenceまたはC規格の§6.5.6(8)を参照してください。
なぜあなたはそれが 'array [13]'に変換されると思いますか? – jotik
私はそこに書いている魔女のアドレスを参照してください – jordan
'array'の型は何ですか? – jotik