"); //-->
作者:下家山
今天,在群里,有人问道:
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图表如下:
按顺序,这四个数组在内存里面的排列顺序应该是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
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
献给ARM初学者
100多个实用工具终于传完了,大家去看吧!!
无线遥控LED灯参考设计
如果美国撤销芯片工具豁免:解析台积电、三星和 SK 海力的中国业务
英特尔重构营销体系:AI取代真人
2.5D/3D 芯片技术将推动半导体封装技术的进步
S3C44B0X原理图库
锂空气电池设计有望增加储能、电动汽车续航里程
从单管到并联:SiC MOSFET功率扩展实战指南
采用ZXCD1O00/150WD类功放电路
特斯拉Robotaxi终于上路了
大家进来看看
新兴企业从隐身状态中浮现,推出织物触觉传感器平台
arm系统开发(1-8)
摩托罗拉半导体走向中国家电与汽车业(图)
历史性 DDR4 现货价格飙升,据报道使 DDR5 翻倍,推动南亚科技的库存暴利
瑞萨电子MCU直流无刷电动工具解决方案
LM386构成的通用型音频功率放大器
study ARM
PANASONIC VSK0317
我现在正打算在S3C4510B上作8019AS的驱动,有兴趣的和我交流!
采用TPA2000D22WD类功放电路
DPPC2006Q六声通数字功放电路
智能家居解决方案
华恒 ARM 培训资料
提供ARM开发板电路板,120RMB
应用的RF4CE协议的射频遥控器系统
国网电能表解决方案
宁德时代领投银河通用,刷新具身智能赛道单笔融资纪录
英伟达全力加速投资人工智能初创公司