为什么scanf()输入已声明长度字符串数组时,可以超过定义的长度呢?

土豆有时说 2014-08-12 11:17:21
代码:
#include<stdio.h>
int main(void){
const char mytal[8]; //已经申明长度为8
scanf("%s",mytal);
printf("%s\n",mytal);
return 0;
}

运行结果:

输入了10个字符,超过了8个了,也显示了10个,不应该只显示7个吗?
求解答
...全文
1839 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
土豆有时说 2014-08-12
  • 打赏
  • 举报
回复 1
引用 7 楼 modyaj 的回复:
[quote=引用 4 楼 sinat_19278443 的回复:] [quote=引用 1 楼 modyaj 的回复:] 先看看scanf 的第二个参数 再看看printf输出字符串的方式 估计就知道了
还是木有清楚[/quote] 第二个参数说明 你操作的是一个内存地址 你在地址上写入的数据超过你你原本计划的大小 对于系统还说 她根本不知道 举个简单的例子:你要在本子上写一行字 你说你写入的是8个字 我现在告诉你 你可以从本子的第二行的第一个位置开始写 结果你写了10个字 作为本子 它哪里会知道你写的10字有问题啊!如果你运气不好 ,刚好写第九个或者第十个字的时候那个位置本子上已经有字了 那么你写了后影响别人(因为你给人家覆盖了嘛)。不知道怎么说恰当不? 同样的 输出函数 从某个地址开始输出,直到遇到结束符才停止!因为你连续输入的字符里面没有结束符 所以都给你输出来了,至于什么时候遇到结束符 那要看运气了(所以有可能会多输出一些意外的字符)[/quote] 懂了懂了
赵4老师 2014-08-12
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
#include<stdio.h>
int main(void){
    char mytal[8];        //已经申明长度为8
    scanf("%7s",mytal);
    printf("%s\n",mytal);
    return 0;
}
modyaj 2014-08-12
  • 打赏
  • 举报
回复
引用 4 楼 sinat_19278443 的回复:
[quote=引用 1 楼 modyaj 的回复:] 先看看scanf 的第二个参数 再看看printf输出字符串的方式 估计就知道了
还是木有清楚[/quote] 第二个参数说明 你操作的是一个内存地址 你在地址上写入的数据超过你你原本计划的大小 对于系统还说 她根本不知道 举个简单的例子:你要在本子上写一行字 你说你写入的是8个字 我现在告诉你 你可以从本子的第二行的第一个位置开始写 结果你写了10个字 作为本子 它哪里会知道你写的10字有问题啊!如果你运气不好 ,刚好写第九个或者第十个字的时候那个位置本子上已经有字了 那么你写了后影响别人(因为你给人家覆盖了嘛)。不知道怎么说恰当不? 同样的 输出函数 从某个地址开始输出,直到遇到结束符才停止!因为你连续输入的字符里面没有结束符 所以都给你输出来了,至于什么时候遇到结束符 那要看运气了(所以有可能会多输出一些意外的字符)
土豆有时说 2014-08-12
  • 打赏
  • 举报
回复
引用 5 楼 zjq9931 的回复:
[quote=引用 楼主 sinat_19278443 的回复:] 代码:
#include<stdio.h>
int main(void){
    const char mytal[8];        //已经申明长度为8
    scanf("%s",mytal);
    printf("%s\n",mytal);
    return 0;
}
运行结果: 输入了10个字符,超过了8个了,也显示了10个,不应该只显示7个吗? 求解答
不少黑客的攻击就是利用这个导致越界,然后入侵系统的。[/quote] 这么厉害啊,学习了 万分感谢!!
  • 打赏
  • 举报
回复
引用 楼主 sinat_19278443 的回复:
代码:
#include<stdio.h>
int main(void){
    const char mytal[8];        //已经申明长度为8
    scanf("%s",mytal);
    printf("%s\n",mytal);
    return 0;
}
运行结果: 输入了10个字符,超过了8个了,也显示了10个,不应该只显示7个吗? 求解答
不少黑客的攻击就是利用这个导致越界,然后入侵系统的。
土豆有时说 2014-08-12
  • 打赏
  • 举报
回复
引用 1 楼 modyaj 的回复:
先看看scanf 的第二个参数 再看看printf输出字符串的方式 估计就知道了
还是木有清楚
  • 打赏
  • 举报
回复
引用 楼主 sinat_19278443 的回复:
代码:
#include<stdio.h>
int main(void){
    const char mytal[8];        //已经申明长度为8
    scanf("%s",mytal);
    printf("%s\n",mytal);
    return 0;
}
运行结果: 输入了10个字符,超过了8个了,也显示了10个,不应该只显示7个吗? 求解答
C语言是不会检查越界行为的,这个需要自己控制。 所以要小心。
auq404 2014-08-12
  • 打赏
  • 举报
回复
正常,mytal[7]里面本来放的是'\0',你这样输入之后将mytal[7]改成了'8',而printf输出的时候要一直要遇到'\0'才停止的.
modyaj 2014-08-12
  • 打赏
  • 举报
回复
先看看scanf 的第二个参数 再看看printf输出字符串的方式 估计就知道了
707wk 2014-08-12
  • 打赏
  • 举报
回复
引用 3 楼 zjq9931 的回复:
C语言是不会检查越界行为的,这个需要自己控制。 所以要小心。
+1

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧