c - 关于 gets(string) 的非常奇怪的错误

标签 c string gets string.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   int a;
   char c[1];
   printf("\n%d\n", a);
   gets(c);
   printf("\n%d\n", a);
   return 0;
}

当使用 gets 读取 c 时,先前打印的 a 的值被打印为具有以下值:0;当使用 scanf("%c", &c); 代替 gets(c); 时,a 的值始终保持不变代码。

我似乎无法弄清楚这是为什么,有人可以解释一下这是怎么可能的吗?

最佳答案

您可能遇到堆栈损坏。 gets() 将输入字符写入您传入的内存地址(指向 c 的第一个元素的指针)。但是,您只分配了 1 个字符,这只够空字符串(包括 null 终止符)。

这就是为什么永远不要使用 gets() 的原因。它不安全,因为它可以覆盖其目标数组的末尾。请改用更安全的函数,例如 fgets()

关于c - 关于 gets(string) 的非常奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20790491/

相关文章:

c - free() : invalid next size (normal) on fclose. 但当 Valgrind 运行时不会

C:使用 scanf() 函数而不是 gets

c - 如何将字符串值分配给 C 中的二维数组?

java - 如何将具有不同字段计数的分隔文本行解析为对象,同时允许扩展?

c - 如何在以下代码中使用 gets() ?

c - c 中负值的位移位

c - 如何在我的 C 限制下检查用户的有效输入?

c - 使用 gets 防止缓冲区溢出

交换字符串中两个字符的C++程序

c - 如何判断进程是否是第一次启动