[C语言][GDB]char str[6] 最后一个是\0 : 为什么反转字符数组会没有输出?

习题出处

《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 
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", 
(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

你可能感兴趣的:([C语言][GDB]char str[6] 最后一个是\0 : 为什么反转字符数组会没有输出?)