换calloc试试?
本帖最后由 watercici 于 2018-6-1 16:42 编辑
stm1024 发表于 2018-6-1 15:49
换calloc试试?
不行,但是换了这个函数后我把结构体中的最后一个字节去掉就能执行成功。
我查了一下错误的原因,是malloc系统函数执行过程中出错了,但是原因没有找到。出错的地方是:绿色和黄色部分
malloc:
0x080073A4 B5F0 PUSH {r4-r7,lr}
0x080073A6 300B ADDS r0,r0,#0x0B
0x080073A8 4D15 LDR r5,; @0x08007400
0x080073AA F0200107BIC r1,r0,#0x07
0x080073AE 2400 MOVS r4,#0x00
0x080073B0 4A14 LDR r2,; @0x08007404
0x080073B2 E00F B 0x080073D4
0x080073B4 6803 LDR r3,
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,//R7的值在这里没有加载过来
0x080073C4 E9C36700STRD r6,r7,
0x080073C8 E000 B 0x080073CC
0x080073CA 6843 LDR r3,
0x080073CC 6013 STR r3,
0x080073CE C002 STM r0!,{r1}
0x080073D0 E004 B 0x080073DC
0x080073D2 1D02 ADDS r2,r0,#4
结贴:错误找到了!
在网上看到一段话:
“昨天在修改自己的代码的时候,碰到了malloc函数内存分配失败,上网翻了翻,一个很可能的原因是之前的代码出现了越界操作,导致malloc分配函数所涉及的一些信息被破坏。在这个思想的指导下,今天又是郁闷了一整天,来来回回看自己的代码。又加不断的调试,终于发现自己的代码中有一个malloc分配的内存大小为0,不是自己预想的大小,而之后的代码又按预想的大小对内存进行了操作,导致了下一个malloc无法分配内存。
总结自己的问题,如果下一次再碰到这样的问题,就要查从不能分配的那个malloc函数开始往回找最近的那个能分配的malloc,出问题的代码应该就在这部分,很可能的原因就是指针越界,对未知的内存进行了操作,导致了malloc不能继续分配内存。”
于是就看了看前面,发现造成这个问题的原因是,在分配空间之前,我调用了结构体中的元素。
谢谢给位的帮助,受益匪浅!
这个坑真没谁去注意。把0赋给malloc能得到一个合法的指针
看来malloc使用要谨慎