问题的由来
近期生活很潇洒,除了穷其他还好。正是阳光明媚的晚上,哦不对,应该是伸手不见五指,正是做坏事,不对,,正是看视频的最佳时机,万年不用的企鹅发出吱吱吱的声音。打开一看,原来是同事发得一个关于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;
}
</stdio.h></stdio.h>
你们觉得这两段代码的结果会相同吗?
你们想一想?
刚开始,我觉得是相同的,但是结果是不同的,一拍大脑,哦,可能是空间是随机分配的,所以每次都地址不同,我真是个大聪明。但出于程序猿的谨慎原则,立马尝试了一番,便有了如下测试,多次运行如下代码:
#include<stdio.h>
int main()
{
int *p0, p1, i;
printf("%d", &i);
return 0;
}
</stdio.h>
万年不变的地址
哦,My God!!!不,大型社死现场,以后再也不敢说自己精通C语言了。仔细分析,又重新运行了上面的第二段代码,嘿嘿,终于被我发现了这其中的奥秘,
这次的地址比第一段代码中变量i的地址小了8个字节,我们知道,局部变量是分配在栈上的,并且栈空间是向低地址增长的,这8个字节正好是指针本身的大小,也许是先给指针分配了空间,然后再给i分配空间,突然灵光炸响,C语言中定义的作用是分配空间并初始化,变量声明是不分配空间的,内存的分配是按照声明的顺序,有了这个前提,一切都解释的通了。
如果有兴趣的同僚,欢迎大家关注我的公众号,一起来学呀
Original: https://www.cnblogs.com/saltape/p/15870796.html
Author: 牙牙学语的猿
Title: C语言中变量幽灵地址??What’s the F**?
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/567621/
转载文章受原作者版权保护。转载请注明原作者出处!