数据存储区域的问题

[复制链接]
3018|9
 楼主| wangjun403 发表于 2011-12-28 20:53 | 显示全部楼层 |阅读模式
KEIL环境,small模式编译
  1. #include <reg52.h>

  2. //int tmp = 1;

  3. int main(void)
  4. {
  5.         int i = 0;

  6.         return 0;
  7. }

编译后 Program Size: data=11.0 xdata=0 code=23

  1. #include <reg52.h>

  2. int tmp = 1;

  3. int main(void)
  4. {
  5.         int i = 0;

  6.         return 0;
  7. }

编译后 Program Size: data=13.0 xdata=0 code=156

  1. #include <reg52.h>

  2. int tmp ;

  3. int main(void)
  4. {
  5.         int i = 0;

  6.         return 0;
  7. }

编译后 Program Size: data=13.0 xdata=0 code=23

网上说的变量如何保存在内存中的
#include
一个进程运行时,所占用的内存,可以分为如下几个部分:
    1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。
    2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS释放。
    3、全局变量、静态变量:初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和和未初始化的静态变量在相邻的的另一块区域。程序结束后由系统自动释放。
    4、文字常量:常量字符串就是存放在这里的,程序结束后由系统释放。
    5、程序代码:存放函数体的二进制代码。


这里有几个问题想请教下
1.为什么定义一个全局变量,code区会变得那么大,好像这个变量放在了code区
2..声明一个全局变量没有赋值,Program Size和没有声明这个变量一样?C语言不是默认没有赋值的全局变量为0吗?
icecut 发表于 2011-12-28 20:56 | 显示全部楼层
不放在code区,那谁知道全局变量初始值是多少?
如果没有初始值。那就直接保留内存几个。直接使用
 楼主| wangjun403 发表于 2011-12-28 21:01 | 显示全部楼层
本帖最后由 wangjun403 于 2011-12-28 21:03 编辑

不放在code区,那谁知道全局变量初始值是多少?
--其他架构的CPU/编译器也是这么做的?
--3、全局变量、静态变量:初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和和未初始化的静态变量在相邻的的另一块区域。程序结束后由系统自动释放。

这个这么解释?

如果没有初始值。那就直接保留内存几个。直接使用
--虽然没有显式初始化,但C标准里不是规定全局变量初始化为0吗?KEIL不支持这个标准?
ayb_ice 发表于 2011-12-29 08:40 | 显示全部楼层
"C语言不是默认没有赋值的全局变量为0吗?"
不知道LZ是在哪本书上看到的
delin17 发表于 2011-12-29 08:46 | 显示全部楼层
初始化的全局变量的初始值必需放到Code里。
不然变量的初始值从那来。开始运行程序前把初始值导入到全局变量对应的地址上的。
没初始化的值是不定的,你用VC试一下就知道了
 楼主| wangjun403 发表于 2011-12-29 09:22 | 显示全部楼层
4# ayb_ice
Unlike automatic variables, external variables are automatically initialized to zero if you don't initialize them. This rule applies to elements of an externally defined array, too

c primer plus 第五版
 楼主| wangjun403 发表于 2011-12-29 09:23 | 显示全部楼层
5# delin17
VS2008中没有初始化的全局变量也是初始化为0的
delin17 发表于 2011-12-30 12:52 | 显示全部楼层
个人认为在未实始化的变量,初始化为0是不正确,尤其在单片机中。
主要看Startup.s里是怎么做的。很多是会加初始化为0。
另外:变量有初始化的值,他一定是从ROM中导入到RAM区的。
具体细节,你可以找一下启动程序的相关资料看看。
Ryanhsiung 发表于 2011-12-30 13:05 | 显示全部楼层
有初始化代码,要初始化这个变量
xiaomuhong26 发表于 2012-1-9 19:38 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:数学才不是浮云

0

主题

629

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部