私は最初のprintfラインか
が
あなたのプログラムが使用a[-1]
コメント場合は、次のコードは、第二のprintfに異なる結果をもたらす理由を誰かが説明でき、ひいては展示未定義の動作。 何かが起きる可能性があります。なぜか1つまたは他のものが起こる理由を正確に把握することは無意味なです。
正確な理由は、最初のprintf
(コメント付きの場合)によって書き込まれるメモリを読み込んでいるということです。
私は(未定義の動作と期待されている)は、異なる結果が得られます。
// with first `printf` commented out:
ffffffff
// with it commented in:
00007fffffffdd20 00007fffffffdd1b
ffffffff
そのメモリがそれにGDBウォッチポイントを設定することによって書き込まれる場合あなたが見ることができる:
(gdb) p a[-1]
$1 = 0 '\000'
(gdb) p &a[-1]
$2 = 0x7fffffffdd1f ""
(gdb) watch *(int*)0x7fffffffdd1f
Hardware watchpoint 4: *(int*)0x7fffffffdd1f
(gdb) c
Continuing.
Hardware watchpoint 4: *(int*)0x7fffffffdd1f
Old value = 0
New value = 255
main() at t.c:12
12 printf("%.16llx %.16llx\n", a, &b);
それは、上記の私の場合、値はcount=-1
の初期化の一部として書かれています。つまり、私のgccのバージョンではcount
はa[0]
の直前にあります。しかし、これはコンパイラのバージョン、このコンパイラの正確な作成方法などに依存します。