C语言中变量幽灵地址??What's the F**?

问题的由来

  近期生活很潇洒,除了穷其他还好。正是阳光明媚的晚上,哦不对,应该是伸手不见五指,正是做坏事,不对,,正是看视频的最佳时机,万年不用的企鹅发出吱吱吱的声音。打开一看,原来是同事发得一个关于C语言的报错问题(顿时兴致即来,毕竟这是我的强项),问题如下:

第一段代码:
#include<stdio.h>
int main()
{
    int *p0, p1, i;

    printf("%d", &i);
    return 0;
}
第二段代码:
#include<stdio.h>
int main()
{
    int *p0, p1, i;
    p0 = &i;
    printf("%d", &i);
    return 0;
}
你们觉得这两段代码的结果会相同吗?

你们想一想?


刚开始,我觉得是相同的,但是结果是不同的,一拍大脑,哦,可能是空间是随机分配的,所以每次都地址不同,我真是个大聪明。但出于程序猿的谨慎原则,立马尝试了一番,便有了如下测试,多次运行如下代码:
#include<stdio.h>
int main()
{
    int *p0, p1, i;

    printf("%d", &i);
    return 0;
}
万年不变的地址

哦,My God!!!不,大型社死现场,以后再也不敢说自己精通C语言了。仔细分析,又重新运行了上面的第二段代码,嘿嘿,终于被我发现了这其中的奥秘,

这次的地址比第一段代码中变量i的地址小了8个字节,我们知道,局部变量是分配在栈上的,并且栈空间是向低地址增长的,这8个字节正好是指针本身的大小,也许是先给指针分配了空间,然后再给i分配空间,突然灵光炸响,C语言中定义的作用是分配空间并初始化,变量声明是不分配空间的,内存的分配是按照声明的顺序,有了这个前提,一切都解释的通了。
如果有兴趣的同僚,欢迎大家关注我的公众号,一起来学呀

posted @ 2022-02-08 12:20  每日猿码  阅读(73)  评论(0编辑  收藏  举报