您的位置:首页 > 编程语言 > C语言/C++

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

2016-12-05 00:09 239 查看
这里有一个数组:

#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]之类的已经超过了这个数组范围的数组就很有可能造成整个系统程序的崩溃,比如改写了其他关键变量的数组造成其他程序陷入死循环当中。但是不同的数组初始化方式造成数组地址不一样也就造成了有可能不一样的初始化形式有一种情况会造成整个系统程序进入了死机状态,而另外一种数组初始化却没有造成死机的问题,因为不一样的数组地址那么当指针超出了这个数组范围的时候修改的数据就不一样,有些数据会造成死机而有些数据却不会。其实造成死机是一个十分极端的情况了,也是一个十分明显的情况,我也应该庆幸,如果造成的不是死机而是其他的更加不明显而且不容易让人朝这方面想的问题就更加的难于发现了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息