习题出处
《Linux C编程一站式学习》 第10章 gdb 断点https://akaedu.github.io/book/ch10s02.html
- 使用gdb调试习题中的代码(反转字符数组),找出输出为空的原因,并修改代码。
习题解答
-
使得每次停下来都会显示这个变量的值
(gdb) display str
以及(gdb) display reverse_str
-
如果字符数组
char str[6]
, 那么str[5] = \0
,实际可以拿来存字符的是下标[0~4] -
想要反转字符数组,要写成
reverse_str[4-i] = str[i];
而不是reverse_str[5-i] = str[i];
注意这里最大下标是4 -
如果写成
reverse_str[5-i] = str[i];
当printf
检测到reverse_str
开头有\0
就停止输出了,这就是为什么习题题面说的,反转输出是空
reverse_str
anno@vm:~$ vim
anno@vm:~$ vim e.c
anno@vm:~$ gcc -g e.c -o e
anno@vm:~$ ./e
hello
olleh
anno@vm:~$ gdb e
(gdb) start
Temporary breakpoint 1 at 0x1169: file e.c, line 4.
Starting program: /home/anno/e
Temporary breakpoint 1, main () at e.c:4
4 {
(gdb) i b
No breakpoints or watchpoints.
(gdb) l
1 #include <stdio.h>
2
3 int main(void)
4 {
5 int i;
6 char str[6] = "hello";
7 char reverse_str[6] = "";
8
9 printf("%s\n", str);
10 for (i = 0; i < 5; i++)
(gdb)
11 reverse_str[4-i] = str[i];
12 printf("%s\n", reverse_str);
13 return 0;
14 }
(gdb) b 9
Breakpoint 2 at 0x55555555519e: file e.c, line 9.
(gdb) display str
1: str = "UU\000\000\320", <incomplete sequence \337>
(gdb) display reverse_str
2: reverse_str = "\377\377\377\177\000"
(gdb) c
Continuing.
Breakpoint 2, main () at e.c:9
9 printf("%s\n", str);
1: str = "hello"
2: reverse_str = "\000\000\000\000\000"
(gdb) n
hello
10 for (i = 0; i < 5; i++)
1: str = "hello"
2: reverse_str = "\000\000\000\000\000"
(gdb)
11 reverse_str[4-i] = str[i];
1: str = "hello"
2: reverse_str = "\000\000\000\000\000"
(gdb)
10 for (i = 0; i < 5; i++)
1: str = "hello"
2: reverse_str = "\000\000\000\000h"
(gdb)
11 reverse_str[4-i] = str[i];
1: str = "hello"
2: reverse_str = "\000\000\000\000h"
(gdb)
10 for (i = 0; i < 5; i++)
1: str = "hello"
2: reverse_str = "\000\000\000eh"
(gdb)
11 reverse_str[4-i] = str[i];
1: str = "hello"
2: reverse_str = "\000\000\000eh"
(gdb)
10 for (i = 0; i < 5; i++)
1: str = "hello"
2: reverse_str = "\000\000leh"
(gdb)
11 reverse_str[4-i] = str[i];
1: str = "hello"
2: reverse_str = "\000\000leh"
(gdb)
10 for (i = 0; i < 5; i++)
1: str = "hello"
2: reverse_str = "\000lleh"
(gdb)
11 reverse_str[4-i] = str[i];
1: str = "hello"
2: reverse_str = "\000lleh"
(gdb)
10 for (i = 0; i < 5; i++)
1: str = "hello"
2: reverse_str = "olleh"
(gdb)
12 printf("%s\n", reverse_str);
1: str = "hello"
2: reverse_str = "olleh"
(gdb) quit
A debugging session is active.
Inferior 1 [process 29502] will be killed.
Quit anyway? (y or n) y
网友评论