精讲全局变量与局部变量同名时,内存如何分配

先看例子

#include <stdio.h>

int a = 1;
int main()
{
    void another_var();
	printf("a = %d   全局变量a的地址是%d\n",a,&a);//地址:4210736
    int a = 2;
    printf("a = %d   局部变量a(main)的地址是%d\n",a,&a);//地址:1895596908
    another_var();
	printf("a = %d   局部变量a(main)的地址是%d\n",a,&a);//地址:1895596908
   return 0;
}

void another_var()
{
	printf("a = %d   全局变量a的地址是%d\n",a,&a);//地址:4210736
    int a = 3;
    printf("a = %d   局部变量a(another_var)的地址是%d\n",a,&a);//地址:1895596876
}

out:

a = 1   全局变量a的地址是4210736
a = 2   局部变量a(main)的地址是1895596908
a = 1   全局变量a的地址是4210736
a = 3   局部变量a(another_var)的地址是1895596876
a = 2   局部变量a(main)的地址是1895596908
//把main中的void another_var()声明放到定义局部变量a(main)下面结果相同

可以看到全局变量a一直分配有储存单元,在main函数中没有定义局部变量a,在函数another_var中没有定义局部变量a,程序都会首先找到全局变量a的地址
其次,main()中的局部变量a(main)与another_var()中的局部变量a(another_var)是不同的存储单元,这和《C语言程序设计–谭浩强》书中的内容是不一致的,书中指出:“函数可以看作是一个复合语句”是不合理的。

函数跟复合语句还是有些区别的。
当main函数中定义局部变量a,这时候会重新给main函数中的局部变量a(main)分配内存,这里的a(main)的有效区间为一直到main函数的return 0;如果中间出现复合语句中有使用变量a,那么这个复合语句中的a是局部变量a(main),而不是全局变量。
但是如果在复合语句中再定义一个局部变量a(for),那么系统会再开辟一个内存存放局部变量a(for),复合语句执行完后局部变量a(for)销毁,这和函数是一样的。
比如:

#include <stdio.h>

int a = 1;
int main()
{
    void another_var();
	printf("a = %d   全局变量a的地址是%d\n",a,&a);
    int a = 2;
    printf("a = %d   局部变量a(main)的地址是%d\n",a,&a);
	
	int i;
	for(i=1;i<2;i++)
	    {
		printf("a = %d   for 全局变量a的地址是%d\n",a,&a);
		int a =3;
		printf("a = %d   局部变量a(for)的地址是%d\n",a,&a);
	    }
	printf("a = %d   局部变量a(main)的地址是%d\n",a,&a);
}

out:

a = 1   全局变量a的地址是4210736
a = 2   局部变量a(main)的地址是-1866543880
a = 2   for 全局变量a的地址是-1866543880
a = 3   局部变量a(for)的地址是-1866543884
a = 2   局部变量a(main)的地址是-1866543880

可以看到在复合语句中直接使用a,找到的是局部变量a(main),而不是全局变量a,这和《C语言程序设计–谭浩强》书中的内容是一致的。

是挺麻烦的,所以还是不要随便起名字。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值