一个C语言的函数的问题

来源:百度知道 编辑:UC知道 时间:2024/06/01 16:55:06
#include"stdio.h
main()
{char st[15];
printf("input string:\n");
get(st);
put(st);}
运行时输入i am a student.这个已经是15个了,而且字符串总是以\0结束的,那么这题是不是错了应该是st[16]而不是st[15]

是的,如果这是某书上的做法,那么,我只能说它为你们提供了一个错误的榜样。
这样使用gets()已经发生了溢出!这是gets()不检查数据边界的bug造成的。

另外,“字符串不是总是以'\0'作为串的结束符”,答案是肯定的,不然puts()函数就不能在合适的地方停下来了。这里st[15]被gets()函数赋值为'\0'。这里要说明的是st[15],st[16]是存在而不合法的,因为字符串实际上就等同于指针,类似st[16]是实在的地址但是是不应该被引用的。

为什么这里溢出没有产生错误?可能系统分配内存是以一个最小的大小整段整段的分配(这个我只是猜测)。你可以试着输入的字符串变长一点,就可以看到内存读写出错的提示了,这就是溢出的严重后果!我在DOS系统下测试字符串长了直接当机。

验证1:st[15]被赋值为'\0'
#include"stdio.h"
main()
{
char st[15];
printf("input string :");
gets(st);
puts(st);
printf("%d",st[15]);
getch();
}
验证2:
#include"stdio.h"
main()
{
char st[15];
printf("input string :");
gets(st);
puts(st);
//printf("%d",st[16]);
st[1] = '\0';
printf("%s\n",st);
printf("%s",st+2);
getch();
}

同样的建议:拒绝get