这个程序适用于输入:"problem"
但停止:"this is the problem,this is the problem,this is the problem"
为什么吗
#include <stdio.h>
int main()
{
char *p;
gets(p);
puts(p);
return 0;
}
是否存在内存保护问题?
答案 0 :(得分:6)
您缺少分配内存,使用gets()
读取数据,因为char * p
只是一个指向随机地址的指针。
这引发了未定义的行为。任何事情都可能发生,即使只用1个字符阅读。
事实上,该程序不会因少于26个字符而崩溃,这只是运气不好。
您可以通过例如更改
来提供记忆char * p;
是
char str[42] = {0}; /* = {0} initializes the array to all `0`s. */
char * p = str;
根据 urzeit 的评论:这使得p指向一个包含42个字符的数组,这本身就足以容纳41个字符的所谓“字符串”。第42个字符被重新分配以容纳0
- 终结符,表示“字符串”的结束。
注意:gets()
是邪恶的,因为程序员无法告诉函数缓冲区传递给gets()
的字符数是多少才能保留。请改用fgets()
。
顺便说一下:int main(void)
应该return
int
。
答案 1 :(得分:3)
实际情况是它可能“正常”用于短字符串,因为你只是覆盖了你的程序所拥有的内存堆栈,所以它不会崩溃。但是,这个词的任何合理定义都没有“起作用”。
从C语言的角度来看,你只知道它只是未定义的行为,它很糟糕,你应该修复它。