C语言编译数组地址分配问题

SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机、32位ARM Cortex-M0处理器、128kB Flash存储器、以及丰富的数字接口。SYD8801片上集成了Balun无需阻抗匹配网络、高效率DCDC降压转换器,适合用于可穿戴、物联网设备等。具体可咨询:http://www.sydtek.com/

这里有一个数组:

#if 0
    uint8_t State_Record[data_days][num_day]=
    {
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0xd0,0x04,0xc0,0x00,0xc0,0x01,0xc0,0x10,0xc0,0x20,0xc5,0x00,0xc5,0x00,0xc5,0x00,
    0xc0,0x04,0xc0,0x00,0xc0,0x01,0xc0,0x10,0xc0,0x20,0xc5,0x00,0xc5,0x00,0xc5,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0xd0,0x04,0xc0,0x00,0xc0,0x01,0xc0,0x10,0xc0,0x20,0xc5,0x00,0xc5,0x00,0xc5,0x00,
    0xc0,0x04,0xc0,0x00,0xc0,0x01,0xc0,0x10,0xc0,0x20,0xc5,0x00,0xc5,0x00,0xc5,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,
    0x10,0x04,0x10,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0xd0,0x04,0xc0,0x00,0xc0,0x01,0xc0,0x10,0xc0,0x20,0xc5,0x00,0xc5,0x00,0xc5,0x00,
    0xc0,0x04,0xc0,0x00,0xc0,0x01,0xc0,0x10,0xc0,0x20,0xc5,0x00,0xc5,0x00,0xc5,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0xd0,0x04,0xc0,0x00,0xc0,0x01,0xc0,0x10,0xc0,0x20,0xc5,0x00,0xc5,0x00,0xc5,0x00,
    0xc0,0x04,0xc0,0x00,0xc0,0x01,0xc0,0x10,0xc0,0x20,0xc5,0x00,0xc5,0x00,0xc5,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,
    0x10,0x04,0x0f,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0xd0,0x04,0xc0,0x00,0xc0,0x01,0xc0,0x10,0xc0,0x20,0xc5,0x00,0xc5,0x00,0xc5,0x00,
    0xc0,0x04,0xc0,0x00,0xc0,0x01,0xc0,0x10,0xc0,0x20,0xc5,0x00,0xc5,0x00,0xc5,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0xd0,0x04,0xc0,0x00,0xc0,0x01,0xc0,0x10,0xc0,0x20,0xc5,0x00,0xc5,0x00,0xc5,0x00,
    0xc0,0x04,0xc0,0x00,0xc0,0x01,0xc0,0x10,0xc0,0x20,0xc5,0x00,0xc5,0x00,0xc5,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,0x00,0x01,0x00,0x10,0x00,0x20,0x05,0x00,0x05,0x00,0x05,0x00,
    0x10,0x04,0x11,0x00,
};
#else
    uint8_t State_Record[data_days][num_day]={0};
#endif

这里#if 1和#else唯一的区别是初始化的方式不一样,前者是直接给定值初始化,后者是不给定值初始化,只是初始化为0而已,这里如果#if 1改为#if 0,则使用uint8_t State_Record[data_days][num_day]={0};作为数组初始化,否则使用第一种方式。

当使用第一种方式的时候我们看看编译结果:

Program Size: Code=29896 RO-data=3156 RW-data=1368 ZI-data=6680 
Program Size: Code=27492 RO-data=3156 RW-data=1364 ZI-data=6548 
Program Size: Code=27492 RO-data=3156 RW-data=1364 ZI-data=6548 

把#if 1改为#if 0,使用第二种方式进行编译时,看到这样的编译结果:

Program Size: Code=29892 RO-data=3156 RW-data=492 ZI-data=7556 
Program Size: Code=27488 RO-data=3156 RW-data=488 ZI-data=7424 
Program Size: Code=27488 RO-data=3156 RW-data=488 ZI-data=7424 

从这里可以看出Code和RO-data是一样的,但是RW-data和ZI-data却是有很大的去呗,也就是说用不同的形式去初始化的时候,在某些工程中,keil会把这些数组的具体数据放倒不同的段中,当然这里也是很有可能可KEIL设置中的定义有关,比如这里的定义:

至于怎么样的定义造成什么样的结果我这里暂时也不深究

从这里还反映出一个问题:

既然这两种不同的初始化方式造成不一样的数组地址分配,那么在不同的程序中尤其是有问题的程序就会有不同的结果,很有可能造成数据溢出等等,比如这个二维数组是

uint8_t State_Record[data_days][num_day];如果在程序中修改了State_Record[data_days][num_day+10]之类的已经超过了这个数组范围的数组就很有可能造成整个系统程序的崩溃,比如改写了其他关键变量的数组造成其他程序陷入死循环当中。但是不同的数组初始化方式造成数组地址不一样也就造成了有可能不一样的初始化形式有一种情况会造成整个系统程序进入了死机状态,而另外一种数组初始化却没有造成死机的问题,因为不一样的数组地址那么当指针超出了这个数组范围的时候修改的数据就不一样,有些数据会造成死机而有些数据却不会。其实造成死机是一个十分极端的情况了,也是一个十分明显的情况,我也应该庆幸,如果造成的不是死机而是其他的更加不明显而且不容易让人朝这方面想的问题就更加的难于发现了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值