新闻  |   论坛  |   博客  |   在线研讨会
C语言数组的编译原理
xiajiashan | 2012-08-28 15:43:35    阅读:1168   发布文章

作者:下家山

今天,在群里,有人问道:

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

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
02年接触ARM和ucos,开发过有线和无线图像报警器,IPCamera,人脸识别系统,OCR识别系统,指纹识别系统,05年开始从事Linux及Rtems下WiFi,camera,Ethernet等驱动开发工作,专做嵌入式linux培训,致力于把我十年来的研发经验传授给每一个学员,招人的可以找我,ximenpiaoxue4016@sina.com
推荐文章
最近访客