2016-07-07 2 views
0

내 프로그램에서 파일을 열고 "Hello world"라고 적습니다. snprintf()를 사용하여 'fname'변수를 채 웁니다. 이 후 gdb를 a.out에 놓고 문자열 'fname'을 출력합니다. 나는 할당하지 않은 문자열 'fname'에 여분의 문자가 많이 있음을 알았다. 이 여분의 등장 인물은 어디에서 왔습니까? 아무도 제발 도와 줄래?왜 snprintf()가 여분의 문자를 쓰나요?

3 int main(void) 
    4 { 
    5  FILE *debug_fp = NULL; 
    6  char fname[100]; 
    7 
    8  snprintf(fname, 100, "./my_debug_%d", getpid()); 
    9  debug_fp = fopen(fname, "w"); 
10  fprintf(debug_fp, "%s", "Hello world"); 
11  return 0; 
12 } 

GDB 출력 :

(gdb) b test.c:10 
Breakpoint 1 at 0x4005be: file test.c, line 10. 

Breakpoint 1, main() at test.c:10 
10   fprintf(debug_fp, "%s", "Hello world"); 
(gdb) p fname 
$1 = "./my_debug_16178\000\000\000\000\000\000\000\000\300\313Ab:\000\000\000\360\[email protected]\000\000\000\000\000\063\[email protected]\000\000\000\000\000\001\000\000\000\000\000\301\000'\[email protected]", '\000' <repeats 13 times>"\300, \313Ab:\000\000\000\360\[email protected]", '\000' <repeats 13 times>"\260, \343\377\377" 
(gdb) q 

감사합니다.

+7

디버거는 무언가를 할당했는지 여부에 관계없이'fname' 배열에 할당 된 모든'100' 문자를 보여줍니다. – mvidelgauz

+0

'fprint'에 100 개의 문자를 생성하도록 명시 적으로 말했습니다. 그것은 정확하게 그것을했습니다. – Koshinae

+2

@Koshinae 아니요. 'snprintf'의 크기 인수는 "최대 ** 크기의 바이트를 쓰기"를 의미합니다. – cnicutar

답변

7

이 경우 gdb는 문자열의 0 종결자를 신경 쓰지 않고 배열 (예 : fname)의 전체 100자를 인쇄합니다.

gdb에서 배열을 C 문자열로 처리하려면 printf "%s" 또는 p /s을 사용할 수도 있습니다.

+0

또는'p (char *) fname'은'p'가 C에서 호출 할 수있는 함수와 다르게 동작한다는 사실에주의를 환기시킵니다. C 함수와 달리 배열 매개 변수를 배열로 볼 수 있습니다 포인터에 대한 일반적인 "부패"는 발생하지 않습니다.) –

+0

@ WumpusQ.Wumbley 이것은 미묘하고 중요한 포인트입니다. 즉'p (char *) fname'은 더 이상 크기 정보를 가지고 있지 않기 때문에 0 터미네이터에 의존합니다. 이 질문에 답을 추가하여 편집하십시오! – cnicutar

+0

감사합니다. – NeilB

0

많은 추가 문자가 할당 된 것을 보는 것이 문제이므로 정의한 메모리 (단순 변수, 배열 또는 포인터)를 항상 초기화하는 것이 좋습니다. 그러면 항상 원하는 내용을 볼 수 있습니다. 귀하의 경우에는

, 당신은 할 수 :

char fname[100] = {0};

내가 GDB에서 얻을 응답은 따라서 더 예측 :

(gdb) b 9 
Breakpoint 1 at 0x400610: file st_fname.c, line 9. 
(gdb) run 
Starting program: /home/gops/data/samples/st_fname.o 

Breakpoint 1, main() at st_fname.c:9 
9   fprintf(debug_fp, "%s", "Hello world"); 
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.166.el6_7.7.x86_64 
(gdb) p fname 
$1 = "./my_debug_26808", '\000' <repeats 83 times> 
(gdb) 

지금 당신은 당신이 기대하는 것을 볼 수 있습니다. 희망이 도움이됩니다.

+0

감사합니다. 이것은 나를 위해 일하고있다. – NeilB

관련 문제