打印

数据定义及空间分配问题!

[复制链接]
2248|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主


请看上两图,关于
unsigned char code *Gsm_StatusReport[MAX_COMD_NUMBER];

code unsigned char *Gsm_StatusReport[MAX_COMD_NUMBER];
的数组定义后的编译结果,RAM区的大小区别。
以上两个定义方式其结果为什么有那么大的区别呢?

相关帖子

沙发
zhaoyu2005| | 2009-11-28 08:51 | 只看该作者
你两个图不是一样的么

使用特权

评论回复
板凳
新好男孩|  楼主 | 2009-11-28 09:14 | 只看该作者

使用特权

评论回复
地板
新好男孩|  楼主 | 2009-11-28 09:14 | 只看该作者
不好意思,图片现在更新了

使用特权

评论回复
5
desert_hawk| | 2009-11-28 11:44 | 只看该作者
unsigned char code *Gsm_StatusReport[MAX_COMD_NUMBER];是在RAM里定义了一个指针数组,这个指针数组指向的是code区的内容。
code unsigned char *Gsm_StatusReport[MAX_COMD_NUMBER];是在code区定义了一个指针数组,这个数组指向的是data区的内容。

使用特权

评论回复
6
ejack| | 2009-11-28 12:54 | 只看该作者
这是个古老的命题了。基本上,每个人在C编程的道路上都会碰到它……:)

使用特权

评论回复
7
ejack| | 2009-11-28 12:55 | 只看该作者
LZ可以自行比较以下三种写法生成的代码:
unsigned char code *pXX;
code unsigned char *pXX;
unsigned char * code pXX;

使用特权

评论回复
8
原野之狼| | 2009-11-28 13:00 | 只看该作者
unsigned char code *Gsm_StatusReport[MAX_COMD_NUMBER];是在RAM里定义了一个指针数组,这个指针数组指向的是code区的内容。
编译器已经为这个数组分配空间了 所以占的空间大 至于指针指向哪里 还需要给指针赋值才能确定 CODE区并没有增加什么内容

code unsigned char *Gsm_StatusReport[MAX_COMD_NUMBER];是在code区定义了一个指针数组,这个数组指向的是data区的内容。
这个数组放在CODE区 被固化了 代码数量增加了 但是数据区并没有定义变量 所以数据区占得数据就少了

使用特权

评论回复
9
desert_hawk| | 2009-11-28 13:29 | 只看该作者
LZ可以自行比较以下三种写法生成的代码:
unsigned char code *pXX;
code unsigned char *pXX;
unsigned char * code pXX;
ejack 发表于 2009-11-28 12:55

后两种写法在keil C51中是一样的哦。

使用特权

评论回复
10
新好男孩|  楼主 | 2009-11-28 13:55 | 只看该作者
THS,受教了。

使用特权

评论回复
11
ejack| | 2009-11-28 22:17 | 只看该作者
9# desert_hawk

是的

使用特权

评论回复
12
mrbbsp| | 2009-11-30 10:33 | 只看该作者
还有点没弄明白,
我们知道一个指针占三字节, 1个表示指针类型,2个表示地址
而lz两种编译相差 32 =16*2 字节,那么还有16字节存在什么地方了呢,又怎么样读出来呢?

使用特权

评论回复
13
desert_hawk| | 2009-11-30 11:29 | 只看该作者
TO LS:
“我们知道一个指针占三字节, 1个表示指针类型,2个表示地址”。这个理论基础就不对,所以导致了你迷惑。

使用特权

评论回复
14
mrbbsp| | 2009-11-30 12:00 | 只看该作者
TO LS:
我在keil里比较       char * a[4]                 1
                       char code *a[4]                 2
和             code char * a[4]                 3
编译后,发现data数量,3条最少,2条比3条多8个,1条比3条多12个,
我用的keil uision2 v2.38a。
ls 请多说几句嘛,谢谢。

使用特权

评论回复
15
xlsbz| | 2009-11-30 12:08 | 只看该作者
本帖最后由 xlsbz 于 2009-11-30 12:19 编辑

KEIL 指针占几个字节可以通过关键字自己决定啊

好像有的占1个 有的占2个 有的占3个

好像占一个的是 直接定位在ram
好像占两个的是直接定位 比如说code 或者 xram
好像占三个的是 先搜索看在不在ram 然后再搜在不在code或者 xram  


结论是作为刚学单片机的 比如说学了1个月 2个月 可以搞搞 理解一下

学久了  就没有必要关心了!

管他三七二十1

因为现在的趋势是硬盘越来越便宜了!

速度越来越快了!

注:我说的可能很不准确的地方用了关键字“好像”!

使用特权

评论回复
16
xlsbz| | 2009-11-30 12:09 | 只看该作者
还有楼主实验这些东西的时候 一定要用简单的例子实验!

这很关键!

使用特权

评论回复
17
desert_hawk| | 2009-11-30 13:16 | 只看该作者
TO LS:
我在keil里比较       char * a[4]                 1
                       char code *a[4]                 2
和             code char * a[4]                 3
编译后,发现data数量,3条最少,2条 ...
mrbbsp 发表于 2009-11-30 12:00

使用keil编译器,只有定义类似 char * Ptr; 这样的指针的时候,编译器才会给每个指针分配三个字节,因为定义时没有指明这个指针指向哪个类型存储器的数据(xdata, code, data),编译器给该指针分配一个字节用来标志存储器类型。
而楼主定义的unsigned char code *Gsm_StatusReport[MAX_COMD_NUMBER];已经明确了该指针数组是指向code区的,所以编译器只需为它的每个元素分配2个字节。

使用特权

评论回复
18
mrbbsp| | 2009-11-30 13:34 | 只看该作者
看了以上两篇,终于明白了,
当时,太粗心了,没有理解三字节指针第一字节的作用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

136

帖子

0

粉丝