这一小段C程序会如何运行

发布于 2022-09-05 06:41:35 字数 128 浏览 21 评论 0

Image

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

烟─花易冷 2022-09-12 06:41:35

数据下标从0开始

谜兔 2022-09-12 06:41:35

会溢出
图片描述clipboard.png

誰ツ都不明白 2022-09-12 06:41:35

VC报错很好理解,a[10]下标越界了。由于VC编译器的栈内存是向下增长的。但是注意a[0]到a[9]数组地址永远是从低到高的。
所以栈空间应该是i a[0]...a[9] 。所以a[10]越界是应该不影响i的。而且Debug方式下未分配的栈空间会设置为0xCC。这样溢出的改写就会被检查到,所以弹出的那个框。就算颠倒变量声明顺序也不行,以为变量之间也插入了0xCC防止溢出。

C语言并没有规定局部变量必须连续的,甚至没有规定用向下增长的栈。

我用GCC G++ 4.9.2(MinGW)试了,竟然是无限循环,取了一下地址,i竟然在a[9]上面。而且不受声明的顺序影响。说明G++重新安排了变量顺序。
然而GCC的行为和预期一致,写成int a[10], i不会崩溃(同前面分析)。但是写成int i, a[10]则发生死循环(因为GCC不会在变量之间插东西)。

小女人ら 2022-09-12 06:41:35

无限循环呗。

a[10]下标越界了,但是正好内存中下一个数据就是后面的变量i,循环变量i被重新赋值成0,循环停不下来了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文