今天在读 C 陷进与缺陷 一书时了解到数组边界赋值移除会覆盖其他变量的问题,书中例子这样写会导致覆盖i
然后死循环:
int i, a[10];
for (i = 1; i <= 10; i++)
a[i] = 0;
于是自己就尝试了一下,发现并没有发生死循环,调试了发现i
的地址在数组a
之前,于是又将声明顺序交换,依然是i
在前面。
然后自己再尝试这样:
int a[4]={1,2,3,4};
int m=0;
int n=0;
int b[4]={5,6,7,8};
int i=0;
int j=0;
调式发现打印的地址是
m: 0x7ffffe275a90
n: 0x7ffffe275a94
a[0]: 0x7ffffe275aa0
a[3]: 0x7ffffe275aac
i: 0x7ffffe275a98
j: 0x7ffffe275a9c
b[0]: 0x7ffffe275ab0
b[3]: 0x7ffffe275abc
即变量在内存中的顺序是 m->n->i->j->a[]->b[]
似乎是 gcc 先给 int 分配了内存然后再给 int 数组分配,随后修改了几次声明顺序依然是这样的规律。
Google 上查了下有人说并没有任何标准定义 C 语言中变量内存分配的顺序是按照代码的顺序来的。但是它确实是有这样一个规律,我也好像没有找到什么官方的解释变量究竟是按照怎么样的顺序在堆栈上分配的,以及为何要这样做。
在这里请教一下,不知道有没有人了解。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.