2017-02-15 15 views
0

누군가가 다음 코드가 첫 번째 printf 행에 주석을 달았을 때 두 번째 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; 
} 

나는 두 번째의 printf에 대한 다음과 같은 결과를 얻을 :

  • 댓글 : 0
  • 주석 : 61

사전에 감사!

iansus

답변

0

내가 처음의 printf 라인 여부

프로그램이 사용 a[-1]을 언급하면 ​​다음 코드는 두 번째의 printf에 다른 결과를 산출 왜 누군가가 설명 할 수, 따라서 전시 정의되지 않은 동작. 무엇이든지 일어날 수 있고, 정확하게 하나 또는 다른 것이 일어나는 이유를 알아내는 것은 무의미한 것이다.

정확한 이유는 처음으로 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] 앞에 있습니다. 그러나 이것은 컴파일러 버전,이 컴파일러의 빌드 방법 등에 따라 달라질 수 있습니다.