你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

结构体指针初始化的问题

[复制链接]
watercici 提问时间:2018-6-1 11:05 /
本帖最后由 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;也不行
收藏 评论34 发布时间:2018-6-1 11:05

举报

34个回答
watercici 回答时间:2018-6-1 16:28:41
本帖最后由 watercici 于 2018-6-1 16:42 编辑

不行,但是换了这个函数后我把结构体中的最后一个字节去掉就能执行成功。
我查了一下错误的原因,是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
watercici 回答时间:2018-6-1 17:30:51
结贴:错误找到了!
在网上看到一段话:
“昨天在修改自己的代码的时候,碰到了malloc函数内存分配失败,上网翻了翻,一个很可能的原因是之前的代码出现了越界操作,导致malloc分配函数所涉及的一些信息被破坏。在这个思想的指导下,今天又是郁闷了一整天,来来回回看自己的代码。又加不断的调试,终于发现自己的代码中有一个malloc分配的内存大小为0,不是自己预想的大小,而之后的代码又按预想的大小对内存进行了操作,导致了下一个malloc无法分配内存。
总结自己的问题,如果下一次再碰到这样的问题,就要查从不能分配的那个malloc函数开始往回找最近的那个能分配的malloc,出问题的代码应该就在这部分,很可能的原因就是指针越界,对未知的内存进行了操作,导致了malloc不能继续分配内存。”

于是就看了看前面,发现造成这个问题的原因是,在分配空间之前,我调用了结构体中的元素。
谢谢给位的帮助,受益匪浅!

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

watercici 回答时间:2018-6-1 11:31:28
andeyqi 发表于 2018-6-1 11:26
malloc 是动态分配的,编译的时候为什么会报错呢,有没有语法错误的。

是啊,malloc是动态分配,而BSS静态内存分配段,所以我认为和malloc没有关系。至于语法错误,我觉得应该没有,因为我之前的这个程序是成功的,我就是在原来的结构体上加了一个“u8 Test_State”;分配内存就出现了问题,我把heap_size的大小增大了也不行,而stact_size的大小为0x400足够了,我认为不用改了
Inc_brza 回答时间:2018-6-1 11:13:33
本帖最后由 Inc_brza 于 2018-6-1 11:15 编辑

先设置对齐看看,另外得是,你这个应该是占用60个字节
andey 回答时间:2018-6-1 11:13:54
提示: 作者被禁止或删除 内容自动屏蔽
watercici 回答时间:2018-6-1 11:23:18
andeyqi 发表于 2018-6-1 11:13
跟下malloc函数看下,是不是bss段内存空间不够啦。

如果BSS段不够的话,编译应该会提示错误吧,我的编译没有问题
andey 回答时间:2018-6-1 11:26:53
提示: 作者被禁止或删除 内容自动屏蔽
andey 回答时间:2018-6-1 11:30:17
提示: 作者被禁止或删除 内容自动屏蔽
watercici 回答时间:2018-6-1 11:35:41
andeyqi 发表于 2018-6-1 11:30
你的代码给bss分配的空间有多大,看你的现象像是只要malloc超过某个长度就出问题。如果可以的话  你看下m ...

那我怎么看跟踪malloc这个函数呢,或者怎么看它的返回值,因为我找不到malloc这个函数的定义,但是我可以用,我也不知道为什么,网上查说是添加#include <malloc.h>,可是我添加了,但却说找不到这个文件。
lvpeng-1619958 回答时间:2018-6-1 11:36:20
堆太小了吗?不会刚好差一个u8的大小吧?!
watercici 回答时间:2018-6-1 11:38:08
andeyqi 发表于 2018-6-1 11:30
你的代码给bss分配的空间有多大,看你的现象像是只要malloc超过某个长度就出问题。如果可以的话  你看下m ...

还有我想问一下,malloc和BSS断没有关系吧,不是应该和堆有关系吗,因为我刚刚在网上看到的,BSS断不是与定义的未初始化变量有关吗,而MALLOC和堆有关系吗?
watercici 回答时间:2018-6-1 11:38:53
lvpeng-1619958 发表于 2018-6-1 11:36
堆太小了吗?不会刚好差一个u8的大小吧?!

不是堆小的问题,因为我增大了也不行?
lvpeng-1619958 回答时间:2018-6-1 11:40:06
watercici 发表于 2018-6-1 11:38
还有我想问一下,malloc和BSS断没有关系吧,不是应该和堆有关系吗,因为我刚刚在网上看到的,BSS断不是与 ...

malloc分配的在堆当中,跟bss没有关系。程序编译完成 bss段就产生了,malloc运行之后才分配内存
andey 回答时间:2018-6-1 11:40:18
提示: 作者被禁止或删除 内容自动屏蔽
andey 回答时间:2018-6-1 11:42:08
提示: 作者被禁止或删除 内容自动屏蔽
lvpeng-1619958 回答时间:2018-6-1 11:42:56
andeyqi 发表于 2018-6-1 11:42
BSS段难道不就是堆栈段吗

bss段在ram中啊,和栈是分开的
123下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版