layout: post
title: GD32内存堆栈配置
description: GD32内存堆栈配置
categories:

  • GD32
    tags:
  • malloc
  • GD32

一、问题简介

使用malloc分配内存空间并进行赋值操作,发现读出来的内容如下所示

image-20230330142625331

二、原因

使用了malloc分配内存空间超过分配的空间限制

三、解决方案

在相应的启动文件中修改heap size

例如GD32F303CE中,修改startup_gd32f30x_cl.s,第53行修改heap_size

四、知识点补充

1. heap_size和stack_size

heap_size和stack_size是两个与内存管理有关的参数。

  1. heap_size指向堆的起始地址,表示可以分配给动态内存分配的最大内存大小。动态内存分配是指在程序运行时动态申请内存,并在不需要时释放内存。通常情况下,heap_size的大小应该按照实际应用需要进行设置,过小会导致无法满足动态内存分配需求,过大则浪费内存。

  2. stack_size指向栈的起始地址,表示可以用于程序调用栈的内存大小。在函数调用时,程序会将参数、局部变量等信息保存在栈中,并在函数返回时自动清除。如果栈空间不够用,则会导致栈溢出等错误。stack_size的大小应根据函数嵌套深度和局部变量大小等因素进行估算,过小也会导致栈溢出。

2. 堆和栈

  1. 栈(Stack)

栈是一种数据结构,它是一个后进先出(LIFO)的容器。栈顶指针指向当前入栈的位置,出栈或者入栈操作都是在栈顶指针上进行的。

在计算机内存中,栈通常被用来保存函数的调用现场。每当一个函数被调用时,它的返回地址、函数参数、局部变量等信息都会被保存到栈帧中,栈帧被放置在栈顶。函数返回时,栈顶的栈帧会被弹出,恢复上一个函数的执行现场。栈的大小是固定的,由编译器在编译时分配,通常是从高地址向低地址生长。

  1. 堆(Heap)

堆也是一种数据结构,与栈不同,它是一个动态分配的内存池。堆中的内存可以在程序运行时动态分配和释放,堆的大小一般比栈大得多。程序员通过调用malloc、new等函数动态分配内存,在不需要的时候通过free、delete等函数释放内存。

在计算机内存中,堆的空间通常是从低地址向高地址生长的,它的分配方式是由操作系统内核决定的。堆的使用需要程序员自己负责管理,不当的使用会导致内存泄漏、空指针等问题。

总结

对于GD32开发的工程中,需要注意这两个属性,以免内存溢出造成未知错误

动态分配的地址存储在堆中,需要修改heap_size

局部变量、参数分配在栈中,需要修改stack_size