今天在读 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]: 0x7fffe275ab0 b[3]: 0x7ffffe275abc 即变量在内存中的顺序是 m->n->i->j->a[]->b[] 似乎是 gcc 先给 int 分配了内存然后再给 int 数组分配,随后修改了几次声明顺序依然是这样的规律。
Google 上查了下有人说并没有任何标准定义 C 语言中变量内存分配的顺序是按照代码的顺序来的。但是它确实是有这样一个规律,我也好像没有找到什么官方的解释变量究竟是按照怎么样的顺序在堆栈上分配的,以及为何要这样做。
在这里请教一下,不知道有没有人了解。
