本帖最后由 watercici 于 2018-6-1 11:08 编辑 结构体指针初始化的问题: 我定义了一个结构体: typedef struct { float Test[10]; u32 addr; u16 Count; u16 Safe_Cnt; u16 Danger_Cnt; u16 Year; u8 Month; u8 Day; u8 Hour; u8 Minute; u8 Seconds; u8 TestResualt; u8 TestState; }RecordStruct; //共59个字节 RecordStruct *OutData; 初始化的时候给他分配内存: OutData = (RecordStruct*)malloc(sizeof (RecordStruct)); 这样调试程序的时候总是会在初始化分配内存的时候进入硬件中断,错误提示是“IMPRECISERR"不精确数据总线错误,但是如果我定义的时候将结构体中的最后一个字节“u8 TestState”去掉的话程序就能够正常执行,不会进入到硬件中断,这是为什么呢? 在线等,谢谢! 一开始我以为是字节数为奇数的原因,可是我又加了一个u8 stuff;也不行 |
不行,但是换了这个函数后我把结构体中的最后一个字节去掉就能执行成功。
我查了一下错误的原因,是malloc系统函数执行过程中出错了,但是原因没有找到。出错的地方是:绿色和黄色部分
malloc:
0x080073A4 B5F0 PUSH {r4-r7,lr}
0x080073A6 300B ADDS r0,r0,#0x0B
0x080073A8 4D15 LDR r5,[pc,#84] ; @0x08007400
0x080073AA F0200107 BIC r1,r0,#0x07
0x080073AE 2400 MOVS r4,#0x00
0x080073B0 4A14 LDR r2,[pc,#80] ; @0x08007404
0x080073B2 E00F B 0x080073D4
0x080073B4 6803 LDR r3,[r0,#0x00]
0x080073B6 428B CMP r3,r1
0x080073B8 D30B BCC 0x080073D2
0x080073BA 428B CMP r3,r1
0x080073BC D905 BLS 0x080073CA
0x080073BE 1A5E SUBS r6,r3,r1
0x080073C0 1843 ADDS r3,r0,r1
0x080073C2 6847 LDR r7,[r0,#0x04] //R7的值在这里没有加载过来
0x080073C4 E9C36700 STRD r6,r7,[r3,#0]
0x080073C8 E000 B 0x080073CC
0x080073CA 6843 LDR r3,[r0,#0x04]
0x080073CC 6013 STR r3,[r2,#0x00]
0x080073CE C002 STM r0!,{r1}
0x080073D0 E004 B 0x080073DC
0x080073D2 1D02 ADDS r2,r0,#4
在网上看到一段话:
“昨天在修改自己的代码的时候,碰到了malloc函数内存分配失败,上网翻了翻,一个很可能的原因是之前的代码出现了越界操作,导致malloc分配函数所涉及的一些信息被破坏。在这个思想的指导下,今天又是郁闷了一整天,来来回回看自己的代码。又加不断的调试,终于发现自己的代码中有一个malloc分配的内存大小为0,不是自己预想的大小,而之后的代码又按预想的大小对内存进行了操作,导致了下一个malloc无法分配内存。
总结自己的问题,如果下一次再碰到这样的问题,就要查从不能分配的那个malloc函数开始往回找最近的那个能分配的malloc,出问题的代码应该就在这部分,很可能的原因就是指针越界,对未知的内存进行了操作,导致了malloc不能继续分配内存。”
于是就看了看前面,发现造成这个问题的原因是,在分配空间之前,我调用了结构体中的元素。
谢谢给位的帮助,受益匪浅!
评分
查看全部评分
是啊,malloc是动态分配,而BSS静态内存分配段,所以我认为和malloc没有关系。至于语法错误,我觉得应该没有,因为我之前的这个程序是成功的,我就是在原来的结构体上加了一个“u8 Test_State”;分配内存就出现了问题,我把heap_size的大小增大了也不行,而stact_size的大小为0x400足够了,我认为不用改了
先设置对齐看看,另外得是,你这个应该是占用60个字节
如果BSS段不够的话,编译应该会提示错误吧,我的编译没有问题
那我怎么看跟踪malloc这个函数呢,或者怎么看它的返回值,因为我找不到malloc这个函数的定义,但是我可以用,我也不知道为什么,网上查说是添加#include <malloc.h>,可是我添加了,但却说找不到这个文件。
还有我想问一下,malloc和BSS断没有关系吧,不是应该和堆有关系吗,因为我刚刚在网上看到的,BSS断不是与定义的未初始化变量有关吗,而MALLOC和堆有关系吗?
不是堆小的问题,因为我增大了也不行?
malloc分配的在堆当中,跟bss没有关系。程序编译完成 bss段就产生了,malloc运行之后才分配内存
bss段在ram中啊,和栈是分开的