C中的char型数组问题

武哥聊编程
Gitchat金牌讲师
博客专家认证
2017-02-21 12:23:31
一个很简单的代码,我弄了很久没想明白:
int main()
{
char name[5];
scanf("%s", name);
printf("%s\n", name):
}
这个程序应该只能输入5个字符,我为啥输入了六七个字母还是可以正常输出呢?当输入8个字母才挂掉!
...全文
617 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
武哥聊编程 2017-02-23
  • 打赏
  • 举报
回复
引用 7 楼 dext 的回复:
就如我之前所说,这个和编译器的实现是有关联的。如果你用的是开源的编译器,是可以查看源代码的。 你追问的那个问题,也是相关的。 比如 定义一个空的结构体。理论上它的内存大小为零,但是绝大部分编译器实际上不是零。所以你小于5的那个情况,是编译器的设定。 [quote=引用 4 楼 eson_15 的回复:] 嗯嗯,确实是这样,我测试了一下,name的大小设置为5的时候,8个字符溢出;设置为9的时候,16个字符溢出;设置为17的时候,24个字符溢出;设置为25的时候,32个字符溢出。所以我得出结论:编译器按8字节对齐分配的。 然后又有个问题出现了,当我将name的大小设置为5以下的时候,都是24个字符才溢出,按照8字节对齐的话应该还是8字符溢出才对呀,不知道层主遇到这个问题没,或者你可以把三行代码在本地跑一下看,确实有这个问题,我没有想通。
[/quote] 好的,谢谢你的回答
dext 2017-02-23
  • 打赏
  • 举报
回复
就如我之前所说,这个和编译器的实现是有关联的。如果你用的是开源的编译器,是可以查看源代码的。 你追问的那个问题,也是相关的。 比如 定义一个空的结构体。理论上它的内存大小为零,但是绝大部分编译器实际上不是零。所以你小于5的那个情况,是编译器的设定。
引用 4 楼 eson_15 的回复:
嗯嗯,确实是这样,我测试了一下,name的大小设置为5的时候,8个字符溢出;设置为9的时候,16个字符溢出;设置为17的时候,24个字符溢出;设置为25的时候,32个字符溢出。所以我得出结论:编译器按8字节对齐分配的。 然后又有个问题出现了,当我将name的大小设置为5以下的时候,都是24个字符才溢出,按照8字节对齐的话应该还是8字符溢出才对呀,不知道层主遇到这个问题没,或者你可以把三行代码在本地跑一下看,确实有这个问题,我没有想通。
楼兰公子 2017-02-23
  • 打赏
  • 举报
回复
看内存长度即可
楼兰公子 2017-02-23
  • 打赏
  • 举报
回复
建议这种问题自己调试
武哥聊编程 2017-02-21
  • 打赏
  • 举报
回复
引用 3 楼 dext 的回复:
编译器生成的代码中 是有空位。可能是因为字节对齐。比如 按4对齐 会在32位机上 提高访问速度。当然各个编译器可能不一样。当溢出时,是在空位里,可能没有问题。再多涉及到其他的数据,就会出问题了。 你换一个编译器,或者 用不同的优化开关,可能那个 8 也会变
嗯嗯,确实是这样,我测试了一下,name的大小设置为5的时候,8个字符溢出;设置为9的时候,16个字符溢出;设置为17的时候,24个字符溢出;设置为25的时候,32个字符溢出。所以我得出结论:编译器按8字节对齐分配的。 然后又有个问题出现了,当我将name的大小设置为5以下的时候,都是24个字符才溢出,按照8字节对齐的话应该还是8字符溢出才对呀,不知道层主遇到这个问题没,或者你可以把三行代码在本地跑一下看,确实有这个问题,我没有想通。
dext 2017-02-21
  • 打赏
  • 举报
回复
编译器生成的代码中 是有空位。可能是因为字节对齐。比如 按4对齐 会在32位机上 提高访问速度。当然各个编译器可能不一样。当溢出时,是在空位里,可能没有问题。再多涉及到其他的数据,就会出问题了。 你换一个编译器,或者 用不同的优化开关,可能那个 8 也会变
武哥聊编程 2017-02-21
  • 打赏
  • 举报
回复
引用 1 楼 mxqin 的回复:
scanf 又不会判断你需要的长度好不!
谢谢你的回答,但是你没好像没理解我的意思
波斯丸子 2017-02-21
  • 打赏
  • 举报
回复
scanf 又不会判断你需要的长度好不!

16,215

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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