此文章记录自己学习的一点理解,如有错误,希望大家指出。
堆栈的共同点:
在单片机中,栈(Stack)和堆(Heap)都是内存区域,用于存储动态分配的变量和数据,栈和堆都位于RAM中。
堆栈的区别:
-
生长方向:栈从高地址往低地址生长,堆从低地址往高地址生长。
-
动态内存分配:栈是先入后出(LIFO)的结构,函数调用时会将参数和局部变量的内存地址压入栈中,函数返回时再出栈。而堆是通过malloc、calloc等函数手动分配内存,程序员需要手动释放内存。
-
内存管理:栈的内存管理由编译器自动管理,当函数返回时,栈帧和栈上的变量都会被清除。而堆的内存管理需要手动管理,如果不释放会导致内存泄漏。
-
大小:栈的大小在编译时指定,一般较小,几百字节到几KB不等。而堆的大小可以根据需要动态调整,一般较大,几KB到几MB不等。
-
使用限制:栈的大小和深度受编译器和单片机硬件的限制,如果栈深度过大,容易导致栈溢出。而堆的大小受单片机内存限制,如果申请的内存过大,容易导致内存不足。
堆栈可能出现的问题:
- 栈溢出:栈只是侵占了堆区空间,理论上不会出现问题,破坏了堆区的数据才会出现问题。
- 内存泄漏:程序员申请了很多空间,没有及时释放,或者内存被分割的很碎,没有一整块完整的内存可以供程序员或者系统使用了。