对内存堆栈管理的简单理解[C语言]

提示:以下是本篇文章正文内容,下面案例可供参考

堆栈管理

  • 1.栈的管理
    • [1.1 变量的作用域总结:](#1.1 变量的作用域总结:)
  • 2.堆内存管理
    • [2.1 堆内存特点](#2.1 堆内存特点)
  • [3. 参考资料](#3. 参考资料)

内存中有专门的堆栈空间,函数中的局部变量是保存在栈中的,而malloc申请的动态内存则是在堆空间中分配的。

  • 静态内存:地址空间中,地址已固定,在程序运行时不再变化;
  • 动态内存:malloc申请内存
    用户malloc申请的内存一般被称为堆内存 heap
    函数调用过程中的内存被称为栈内存stack

1.栈的管理

栈是一种数据结构,特点是FIFO先进后出,可以想象一下子弹上膛,先上的子弹最后打出。

栈有两种操作:入栈push和出栈pop。它俩都靠栈指针SP维护。

在嵌入式系统的启动代码中,会看到系统一上电开始运行的都是汇编代码,在跳到第一个C语言函数运行之前,都要先初始化栈空间。

在linux中通过下面命令查看核设置栈大小

bash 复制代码
ulimit -s //查看栈大小,单位KB
ulimit -s 4096 //设置栈大小为4MB

下面是一个让栈溢出的简单程序

c 复制代码
#include <stdio.h>
int main()
{
    char a[8*1024*1024];
    int i;
    printf("hello world!\n");
    return 0;
}

数组a保存在栈中,占了8MB栈空间,一下子把进程的栈空间耗光了,其他局部变量就没有空间存储,就发生了栈溢出。

c 复制代码
# ./a.out
Segmentation fault (core dumped)

注意下面几点:

  • 尽量不在函数中使用大数组
  • 函数嵌套不可太深
  • 递归层数不可太深

函数内的局部变量、传递实参都在栈中。函数的栈空间称为栈帧FP。每个栈帧用两个寄存器FP和SP维护。FP指向栈底,SP指向栈顶。

1.1 变量的作用域总结:

全局变量作用域:

  1. 全局变量的作用域由文件来限定
  2. 可使用extern扩展,被其他文件引用
  3. 可以用static进行限制,只能在本文件中被引用

局部变量作用域:

  1. 局部变量的作用域由{}限定
  2. 可以用static修饰局部变量来改变他们的存储属性(生命周期),但不能改变其作用域

2.堆内存管理

堆是linux进程空间中一片可动态扩展或者缩减的内存区域。

申请和释放堆内存可使用malloc()和free()这对函数。这对函数在C标准库中定义。

c 复制代码
#include <stdlib.h>
void *malloc(size_t size);
void free(void *ptr);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);

malloc:在堆空间申请一块内存,返回用户一个指向这块内存的指针

calloc:在堆内存中申请nmemb个单位长度为size的连续空间,并初始化这块内存为0;

realloc:当申请内存不够,可以用realloc动态调制内存块的大小

使用malloc()、calloc()、realloc(0后,都要用free(),否则内存泄漏。

2.1 堆内存特点

  • 堆内存是匿名的,一般通过指针访问
  • 在函数运行中,对函数栈帧的内存访问也一般通过栈指针FP或者SP相对寻址访问
  • 堆内存申请后要释放,malloc和free
  • 栈内存由编译器维护,函数运行时开辟一个栈帧空间,运行结束栈帧空间随之销毁释放

3. 参考资料

《嵌入式C语言自我修养从芯片.pdf》

相关推荐
ocean210316 分钟前
2025-2026年C++专题大厂面试高频问题
开发语言·c++·面试
白远山23 分钟前
健身场馆无人自动化系统实战指南:从架构设计到部署全流程解析
java·开发语言·架构·需求分析
Logic10142 分钟前
C语言/数据结构位运算题解:异或XOR找出独特卡片数字——只出现一次的元素
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
郝学胜-神的一滴1 小时前
C++20模板元编程 02:吃透模板基础核心四大核心知识点
开发语言·数据结构·c++·程序人生·软件工程·visual studio
troy1281 小时前
Visual Studio Code 详细教程:从入门到高效开发
开发语言·python
泡海椒1 小时前
jquick-pdf 超详细入门教程:Java 轻量级 HTML 模板生成 PDF 工具
java·开发语言
八年。。1 小时前
WSL学习(三)——搭建Linux + C++ + SOME/IP 基础开发环境
开发语言·笔记·ubuntu
代码王同学1 小时前
2026.9.15日C++类和对象学习收获笔记
c语言·c++
孙启超1 小时前
【AI开发之Rust】第 6 课:结构体、枚举与方法 —— 开始定义自己的类型
开发语言·人工智能·后端·ai·rust
irislinAmelia1 小时前
Day11文章_多路视频流加权公平调度与令牌桶QoS
c语言·人工智能