就如我之前所说,这个和编译器的实现是有关联的。如果你用的是开源的编译器,是可以查看源代码的。 你追问的那个问题,也是相关的。 比如 定义一个空的结构体。理论上它的内存大小为零,但是绝大部分编译器实际上不是零。所以你小于5的那个情况,是编译器的设定。 [quote=引用 4 楼 eson_15 的回复:] 嗯嗯,确实是这样,我测试了一下,name的大小设置为5的时候,8个字符溢出;设置为9的时候,16个字符溢出;设置为17的时候,24个字符溢出;设置为25的时候,32个字符溢出。所以我得出结论:编译器按8字节对齐分配的。 然后又有个问题出现了,当我将name的大小设置为5以下的时候,都是24个字符才溢出,按照8字节对齐的话应该还是8字符溢出才对呀,不知道层主遇到这个问题没,或者你可以把三行代码在本地跑一下看,确实有这个问题,我没有想通。
嗯嗯,确实是这样,我测试了一下,name的大小设置为5的时候,8个字符溢出;设置为9的时候,16个字符溢出;设置为17的时候,24个字符溢出;设置为25的时候,32个字符溢出。所以我得出结论:编译器按8字节对齐分配的。 然后又有个问题出现了,当我将name的大小设置为5以下的时候,都是24个字符才溢出,按照8字节对齐的话应该还是8字符溢出才对呀,不知道层主遇到这个问题没,或者你可以把三行代码在本地跑一下看,确实有这个问题,我没有想通。
编译器生成的代码中 是有空位。可能是因为字节对齐。比如 按4对齐 会在32位机上 提高访问速度。当然各个编译器可能不一样。当溢出时,是在空位里,可能没有问题。再多涉及到其他的数据,就会出问题了。 你换一个编译器,或者 用不同的优化开关,可能那个 8 也会变
scanf 又不会判断你需要的长度好不!
16,215
社区成员
26,594
社区内容
加载中
试试用AI创作助手写篇文章吧