全局变量和局部变量

#include<stdio.h>

int c = 526;
char b = c;

int main()
{  //int c = 526;
//char b = c;
printf("%d\n",b);
	return 0;
}

把一个全局变量c赋值给b为什么不能编译通过?

#include<stdio.h>

//int c = 526;
//char b = c;

int main()
{  int c = 526;
char b = c;
printf("%d\n",b);
	return 0;
}

把一个局部变量c赋值给b为什么能编译通过?

以单片机为例子,程序编译后变成hex下载到flash中,flash中有数据段,代码段,数据段中保存着全局变量的数据,代码段中保存着程序要执行的代码,单片机上电,会有一段汇编指令把数据段原封不动的复制到RAM中的全局存储区域。这样无法将c的值赋值给b,所以编译器不会通过。执行完这段汇编指令后,开始执行main函数,局部变量是main函数的代码,经过cpu处理会把char b =c转换成先从内存中取c的数据,再给b,再放到栈里去。所以编译器允许这样做。

为什么在c++中两段代码都能编译通过呢?

c++的编译器会在最开始执行的汇编指令中加入动态初始化的代码,让程序运行时候先进行动态的初始化,再把数据段原封不动的复制到RAM中的全局存储区域。这样c的值就可以赋值给b了。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值