原创 C语言数组编译原理

2011-10-13 07:03 3309 21 30 分类: 消费电子

作者:下家山

今天在群里,有人问道:

char s[]="123456789";

char d[]="123";

strcpy(d,s);

printf("%s,%s\n",d,s); 输出什么?VC6上试过输出123456789,56789

这个问题其实就是考虑:上面字符串s和d的内存分配是123456789\0123\0还是123\0123456789\0,

根据结果是123\0123456789\0分配。为什么是这样分配呢,不是根据先后顺序分配,先分配s在分配d吗?

于是,我在ads(arm编译器,ANSI/ISO Standard C)定义了四个数组(全局的)

unsigned char s[]="123456789";

unsigned char d[]="123";

unsigned char sendstr[]="I am xiajiashan!\n";

unsigned char e[]="1235";

然后,编译,查看编译map图表如下:

未命名.jpg

 

 

按顺序,这四个数组在内存里面的排列顺序应该是s,d,sendstr,e但是,根据ads的编译结果却是d,e,s,sendstr。

这个时候,我怀疑是不是编译器根据我使用顺序来编译呢!但我在main里面的调用顺序是:

SendStr_Uart0(sendstr,sizeof(sendstr));

SendStr_Uart0(e,sizeof(e));

SendStr_Uart0(s,sizeof(s));

SendStr_Uart0(d,sizeof(d));

所以,从我自己的实验,及上面问题的现象推出:

编译器(不管是VC6.0,还是ads,我想其他编译器也一样)会从小的开始编译,分配内存。

我猜是这样的,因为编译器在编译一个变量前(特别是这种数组,所以在VC程序里面是不建议把数组定义成全局变量的,一般是先定义一个指针,然后用malloc申请你这个数组所需大小的内存,然后赋值给上面的指针),首先是判断要分配多大的内存。

         假设你给了一个1G大的数组,当然有点夸张,不过夸张才能说明问题。编译器也要去编译,但是这个时候他是先满足小内存的申请(其实把全局数组,就是在编译的时候分配内存,malloc是在程序运行时分配内存);

我一直在找一本编译原理的书,当当上也有,但写得太烂太烂,路过的若有请介绍一下,我的QQ:1209050967

PARTNER CONTENT

文章评论9条评论)

登录后参与讨论

sead_cn_562752139 2014-10-2 08:08

骑行阻力是个问题,可以用一种可以弯曲的太阳能充电器取代之。

用户467351 2013-9-6 19:43

[[[[[[[[[[[[[[[[[[[强大

用户467351 2013-9-6 19:30

没遇见过,但有了网友的提示,以后遇见也会舒服很多,谢谢

用户1627489 2012-10-25 09:32

普通二极管整流效率太低。假设你的整机输出功率为10W,那么流过二极管的电流就不会少于800mA,此时普通的二极管在该电流下管压降不会少于0.3v,(管压降与电流成正比)。那么在二极管上的的功率损耗就有0.3X0.6。建议用MOS管做同步整流压降可至0.02V.(500mA电流时,具体管子参数不太清楚了)

用户1326533 2012-9-25 20:47

这个不知道好不好用

用户1130179 2012-9-25 17:29

技术无处不在啊,希望继续!

用户1048680 2012-9-25 07:23

這設備簡單小巧容易攜帶及安裝 ,重要的是綠色環保.

用户1048680 2012-9-25 07:19

這種小型又簡單的發電機 除了裝在腳踏車外也可以用風與水的能量來帶動他 他裝在腳踏車上將增加騎者不少負擔,是因為小型發電機與車輪磨差產生的阻力,若裝有電持畜電而上坡實可以斷開發電可以克服此問題.

用户1602177 2012-9-24 17:37

关注~~对了,博主的整个装备是要托运过去?

用户1589494 2011-10-12 21:40

C经典问题
相关推荐阅读
用户1037328 2016-04-17 17:59
好的理论可以避免犯错——读《丈量世界》有感!
     《丈量世界》,早就因为仰慕高斯而想看这本书      1.殊途同归      这本书写的是高斯和洪堡两个人,为什么要把这两个人放在一起写呢?因为高斯是一个宅男,不喜欢什么旅游,考察!他觉得...
用户1037328 2016-04-05 09:10
叛逆在爱因斯坦性格中的重要性(一)
叛逆在爱因斯坦性格中的重要性(一) 《爱因斯坦传》读书笔记      昨天晚上,读完了2016年书单的第二部书,《爱因斯坦传》。我想梳理一下自己读这本书的收获,或者说感悟!在读这...
用户1037328 2016-04-05 09:09
叛逆在爱因斯坦性格中的重要性(二)
叛逆在爱因斯坦性格中的重要性(二) 《爱因斯坦传》读书笔记                                四  叛逆性 在爱因斯坦的同时期科学家中,我想比他IQ...
用户1037328 2014-07-09 19:55
RTEMS系统时钟原理
作者,下家山(转载请注明作者及出处,请尊重原创)   专注嵌入式(ARM7,Cortex-M0,Cortex-M3,ARM9,linux)培训 一:从应用看原理      每个...
用户1037328 2014-07-09 19:47
RTEMS在S3C2410上的移植(一)
作者:下家山(转载,请注明) 1:RTEMS开发环境建立 1.1开发环境建立前的准备工作 因为RTEMS开发环境主要用的是GNU的工具链,所以需要一台装有Linux的HOST. 1.2...
用户1037328 2014-07-09 19:45
深入浅出学Makefile<三,如何自动生成Makefile>
(请尊重原创,转载请注明,作者:下家山) 五: 运行make编译得到可执行文件 root@parson-desktop:/home/parson/tmp/automk# make gcc ...
我要评论
9
21
关闭 站长推荐上一条 /3 下一条