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

问题的由来

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

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

    printf("%d", &i);
    return 0;
}
&#x7B2C;&#x4E8C;&#x6BB5;&#x4EE3;&#x7801;&#xFF1A;
#include<stdio.h>
int main()
{
    int *p0, p1, i;
    p0 = &i&#xFF1B;
    printf("%d", &i);
    return 0;
}
</stdio.h></stdio.h>

你们觉得这两段代码的结果会相同吗?

你们想一想?

刚开始,我觉得是相同的,但是结果是不同的,一拍大脑,哦,可能是空间是随机分配的,所以每次都地址不同,我真是个大聪明。但出于程序猿的谨慎原则,立马尝试了一番,便有了如下测试,多次运行如下代码:

#include<stdio.h>
int main()
{
    int *p0, p1, i;

    printf("%d", &i);
    return 0;
}
</stdio.h>

万年不变的地址

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

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

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

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

Original: https://www.cnblogs.com/saltape/p/15870796.html
Author: 牙牙学语的猿
Title: C语言中变量幽灵地址??What’s the F**?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/567621/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球