watercici 发表于 2018-6-1 11:05:09

结构体指针初始化的问题

本帖最后由 watercici 于 2018-6-1 11:08 编辑

结构体指针初始化的问题:
我定义了一个结构体:
typedef struct
{
      float Test;
      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;也不行

Inc_brza 发表于 2018-6-1 11:13:33

本帖最后由 Inc_brza 于 2018-6-1 11:15 编辑

先设置对齐看看,另外得是,你这个应该是占用60个字节

andeyqi 发表于 2018-6-1 11:13:54

跟下malloc函数看下,是不是bss段内存空间不够啦。

watercici 发表于 2018-6-1 11:23:18

andeyqi 发表于 2018-6-1 11:13
跟下malloc函数看下,是不是bss段内存空间不够啦。

如果BSS段不够的话,编译应该会提示错误吧,我的编译没有问题

andeyqi 发表于 2018-6-1 11:26:53

本帖最后由 andeyqi 于 2018-6-1 11:41 编辑

malloc 是动态分配的,编译的时候为什么会报错呢,又没有语法错误的。

andeyqi 发表于 2018-6-1 11:30:17

watercici 发表于 2018-6-1 11:23
如果BSS段不够的话,编译应该会提示错误吧,我的编译没有问题

你的代码给bss分配的空间有多大,看你的现象像是只要malloc超过某个长度就出问题。如果可以的话你看下malloc函数的返回是不是失败了,成功之后再使用这段内存,没成功就是用肯定会有问题。

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足够了,我认为不用改了

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和堆有关系吗?
页: [1] 2 3 4
查看完整版本: 结构体指针初始化的问题