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 观察点,并观察 它被覆盖的确切位置