• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

取消结构体自动4字节对齐 和 函数内实现结构体栈溢出

_落雪千寒灬 2018-07-15 浏览量:1716
在一个通讯协议解析里 我用共用体嵌套结构体的方式(共6个字节) 并为了使结构体成员不改变位置 在结构体声明的时候使用了1字节对齐  在某个函数中创建了一个结构体对象并使用 结果函数执行完后栈溢出了 然后我把这个结构体对象的实现放在了函数外 就没有出现问题 请问为什么会造成这种现象 用的是STM32F0系列单片机
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 典型的栈溢出问题,结构体变量放在函数内部,占用的是系统的栈空间;放在函数外部,占用的是堆空间。在启动文件中有关于堆和栈分配空间大小的设定

    例如:startup_stm32f030x8.s

    Stack_Size     EQU     0x860;
    Heap_Size      EQU     0x400;
    ​其中Stack_Size就是设置的栈空间大小,如果这里设置的不够的,在函数内部定义变量占用空间大的话就会造成栈溢出。所以需要计算函数内部所定义变量占用空间的大小,并在启动文件中设置栈的大小大于计算值一倍以上,这样栈溢出的情况就可以避免了。

    • 发布于 2018-07-15
    • 举报
    • 评论 1
    • 0
    • 0
_落雪千寒灬 回复了 Angel_YY:其实当时函数嵌套不多 局部变量也不多 这个结构体也才6个字节 也许还有别的原因造成栈溢出 回复

其他答案 数量:2
  • 结构体内成员变量默认是按照数据类型对齐的,short对齐在2字节边界,long对齐在4字节边界,按照书写顺序分配。arm中最好不要取消对齐,处理short和long的CPU制令是要求数据有边界对齐的,你不对齐,编译器要在运算前做对齐转换,程序执行效率极低。另外M0内核芯片用指针访问不对齐的数据,直接产生内存错误fault。
    • 发布于2018-07-15
    • 举报
    • 评论 0
    • 1
    • 0

  • 函数内定义的都是放在栈里面的,函数外定义的放在堆里面,这二者的空间要分配好
    • 发布于2018-07-28
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

取消结构体自动4字节对齐 和 函数内实现结构体栈溢出