为什么这个程序不适用于大于25个字符的输入?

时间:2013-09-01 07:02:01

标签: c pointers

这个程序适用于输入:"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;
}

是否存在内存保护问题?

2 个答案:

答案 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语言的角度来看,你只知道它只是未定义的行为,它很糟糕,你应该修复它。