#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了。