C语言能忘记一个变量吗?
Can the C language forget a variable?
这听起来很奇怪,但我注意到我的程序崩溃了,因为一个变量真的被遗忘了(变成 0)。
这是 gdb 的输出
...
709 while (progressione->avanti != NULL) {
(gdb) p nGiocatori
= 4
(gdb) step
713 lista_stanze[i] = *progressione; // aggiungo la stanza alla
lista
(gdb) p nGiocatori
= 4
(gdb) step
731 puts("");
(gdb) p nGiocatori
= 0
(gdb)
如您所见,在 puts("") 之后 nGiocatori 的值变为 0。
该问题与 puts("") 无关,替换 puts("") 的任何语句都会导致同样的问题。
谁能给我解释一下为什么会发生这种奇怪的事情?
(不知道有没有关系,但是nGiocatori变量是全局静态unsigned short,它的值是通过scanf取的。)
I noticed that my program crashes because a variable is literally forgotten
这不是“忘记”,而是被覆盖了。
听起来你的程序中有一个全局缓冲区溢出。几种通用方法可以帮助您:
- 打开所有编译器警告并确保您的代码不会产生任何警告(对于 GCC,使用
-Wall -Wextra -Werror
)
- 使用地址清理程序构建您的程序 (
gcc -fsanitize=address ...
)
- 在变量上设置一个 GDB 观察点,并观察 它被覆盖的确切位置
这听起来很奇怪,但我注意到我的程序崩溃了,因为一个变量真的被遗忘了(变成 0)。
这是 gdb 的输出
...
709 while (progressione->avanti != NULL) {
(gdb) p nGiocatori
= 4
(gdb) step
713 lista_stanze[i] = *progressione; // aggiungo la stanza alla
lista
(gdb) p nGiocatori
= 4
(gdb) step
731 puts("");
(gdb) p nGiocatori
= 0
(gdb)
如您所见,在 puts("") 之后 nGiocatori 的值变为 0。 该问题与 puts("") 无关,替换 puts("") 的任何语句都会导致同样的问题。
谁能给我解释一下为什么会发生这种奇怪的事情?
(不知道有没有关系,但是nGiocatori变量是全局静态unsigned short,它的值是通过scanf取的。)
I noticed that my program crashes because a variable is literally forgotten
这不是“忘记”,而是被覆盖了。
听起来你的程序中有一个全局缓冲区溢出。几种通用方法可以帮助您:
- 打开所有编译器警告并确保您的代码不会产生任何警告(对于 GCC,使用
-Wall -Wextra -Werror
) - 使用地址清理程序构建您的程序 (
gcc -fsanitize=address ...
) - 在变量上设置一个 GDB 观察点,并观察 它被覆盖的确切位置