C语言变量内存地址的分配

来源:互联网 发布:显示器检测软件 编辑:程序博客网 时间:2024/05/16 12:57

一个简单的测试

#includeint a;int b;int c;int main(){int x;int y, z;printf("%d/n", &a);printf("%d/n", &b);printf("%d/n", &c);printf("/n");printf("%d/n", &x);printf("%d/n", &y);printf("%d/n", &z);return 0;}

输出结果:

421496442149684214972229353222935282293524
可以看出,全局变量的地址分配是从内存编号小的地址开始,而函数内部的变量是从内存编号大的地址开始的。不过,这只是最简单的情形,所有变量都是4个字节的简单变量。接下来将针对各种情况做针对性的试验。

数组的地址分配

根据编程经验,可以推测一个数组的地址一定是连续的,并且,无论在何处定义,数组的地址都是随下标递增的。因此,下面两段代码才能等价地使用:

int i;int a[10];for ( i=0; i < 10; ++i ) scanf("%d", &a[i]);
int i;int a[10];for ( i=0; i < 10; ++i ) scanf("%d", a + i);

但是,数组的地址于其他变量的地址的关系还不能确定,需要做一些测试:

#includeint a[4];int b;int main(){int x[4];int y;printf("%X %d/n", &b, &b);printf("%X %d/n", &a[0], &a[0]);printf("%X %d/n", &a[1], &a[1]);printf("%X %d/n", &a[2], &a[2]);printf("%X %d/n", &a[3], &a[3]);printf("/n");printf("%X %d/n", &x[0], &x[0]);printf("%X %d/n", &x[1], &x[1]);printf("%X %d/n", &x[2], &x[2]);printf("%X %d/n", &x[3], &x[3]);printf("%X %d/n", &y, &y);return 0;}

输出结果:

4050C4 42149804050B4 42149644050B8 42149684050BC 42149724050C0 421497622FF10 229352022FF14 229352422FF18 229352822FF1C 229353222FF0C 2293516
如果根据第一次试验的得出规则,先定义的int a[10];应该比int b;先分配空间,得到更高编号的地址,但是实际上b的地址却是最高的。如果将
int a[4];int b;
交换为:
int b;int a[4];
结果为:
4050C4 42149804050B4 42149644050B8 42149684050BC 42149724050C0 421497622FF10 229352022FF14 229352422FF18 229352822FF1C 229353222FF0C 2293516
和上次没有变化。于是,可以暂时作如下假设:第二次是按正常规则,先分配b的地址,为最高编号,而第一次确实是先分配的a的地址,但不是将编号最高的地址分配给了它,因此,空出来的位置就留给了后来的b。

未完。

原创粉丝点击