C语言学习笔记25——栈,堆和静态存储区

本文介绍了程序中栈和堆的概念及其用途。栈用于维护函数调用上下文,包括参数、返回地址等;堆则是程序预留的内存空间,用于动态分配。文章还解释了为何需要同时具备栈和堆,并提供了C语言中堆操作的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序中的栈

  • 栈是现代计算机程序中最重要的概念之一

  • 栈在程序中用于维护函数调用上下文

  • 函数中的参数和局部变量存储在栈上

  • 栈保留了一个函数调用所需的维护信息

    • 参数

    • 返回地址

    • 局部变量

    • 调用上下文

函数调用过程

  • 每次函数调用都对应着一个栈上的活动记录

    • 调用函数的活动记录位于栈的中部

    • 被调函数的活动记录位于栈的顶部

  • 函数调用时,对应的栈空间在函数返回前是专用的

  • 函数调用结束后,栈空间将被释放,数据不再有效


程序中的堆

  • 堆是程序中一块预留的内存空间,可由程序自由使用

  • 堆中被程序申请使用的内存在被主动释放前一直有效

问:
    为什么有了栈还需要堆
答:
    栈上的数据在函数返回后就会被释放掉,无法传递到函数外部
    而堆空间在主动释放前一直有效
  • C语言程序通过库函数的调用获得堆空间

    • 头文件:malloc.h

    • malloc函数 ==> 以字节的方式动态申请堆空间

    • free函数 == > 将堆空间归还给系统


程序的静态存储空间

  • 静态存储区随着程序的运行而分配空间

  • 静态存储区的生命周期直到程序运行结束

  • 在程序的编译期静态存储区的大小就已经确定

  • 静态存储区主要用来保存全局变量静态局部变量

  • 静态存储区的信息最终会保存到可执行程序中

/*
    测试代码
    静态存储区的验证
*/

#include <stdio.h>

int g_v = 1;

static int g_vs  = 2;

void f()
{
    static int g_vl = 3;

    printf("%p\n", &g_vl);
}

int main()
{
    printf("%p\n", &g_v);

    printf("%p\n", &g_vs);

    f();

    return 0;
}

运行结果

00402000
00402004
00402008
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值