내 프로그램에서 파일을 열고 "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
감사합니다.
디버거는 무언가를 할당했는지 여부에 관계없이'fname' 배열에 할당 된 모든'100' 문자를 보여줍니다. – mvidelgauz
'fprint'에 100 개의 문자를 생성하도록 명시 적으로 말했습니다. 그것은 정확하게 그것을했습니다. – Koshinae
@Koshinae 아니요. 'snprintf'의 크기 인수는 "최대 ** 크기의 바이트를 쓰기"를 의미합니다. – cnicutar