2017-02-15 6 views
0

私が最初のprintf行をコメントした場合、次のコードが2番目のprintfで異なる結果をもたらす理由を誰かが説明できますか?64ビット説明できない結果をもたらす64ビットELF

/* gcc -O0 -o test test.c */ 
#include <stdio.h> 
#include <stdlib.h> 

int main() { 

    char a[20] = {0}; 
    char b = 'a'; 
    int count=-1; 


    // printf("%.16llx %.16llx\n", a, &b); 
    printf("%x\n", *(a+count)); 

return 0; 
} 

は、私は2番目のprintfのために次のような結果を得る:

  • コメント:0
  • アンコメント:61

感謝を事前に!

iansus

答えて

0

私は最初の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のバージョンではcounta[0]の直前にあります。しかし、これはコンパイラのバージョン、このコンパイラの正確な作成方法などに依存します。

関連する問題