【漫谈C语言和嵌入式001】C语言内存结构分析

C语言内存结构详解

1. 栈区 (Stack)

栈区用于存储函数调用时的局部变量、函数参数和返回地址等。栈的特点是先进后出(LIFO, Last In First Out),由编译器自动管理。

  • 特点

    • 生命周期短:随着函数调用结束而自动释放。
    • 存储速度快:通过指针直接操作。
    • 存储空间有限:通常由操作系统决定。
    • 栈区通常用于存储较小的对象,因为频繁的分配和释放可能导致栈溢出。
  • 示例

void func() {
    int local_var = 10;  // 存储在栈上
}
2. 堆区 (Heap)

堆区用于动态分配内存,由程序员手动管理。使用malloc(), calloc(), realloc()free()等函数来分配和释放内存。

  • 特点

    • 生命周期长:直到程序结束或手动释放。
    • 存储空间大:根据需求分配。
    • 分配速度慢:需要操作系统支持。
    • 堆区可以用于存储较大的对象,如数组、结构体等。
    • 堆区内存分配失败时通常会返回NULL
  • 示例

int *dynamic_var = malloc(sizeof(int));  // 分配在堆上
*dynamic_var = 20;
free(dynamic_var);  // 手动释放
3. 静态区 (Static)

静态区用于存储全局变量、静态变量和常量等。这些变量在整个程序的生命周期内都存在。

  • 特点

    • 生命周期长:整个程序期间都存在。
    • 存储空间固定:由编译器分配。
    • 静态区通常用于存储程序中需要持久存储的数据。
    • 全局变量和静态变量的生命周期从程序启动开始,直到程序结束。
  • 示例

int global_var = 30;  // 存储在静态区
static int static_var = 40;  // 存储在静态区
4. 文本区 (Text)

文本区用于存储程序的代码段,包括函数体、指令等。这部分内存只读,不可修改。

  • 特点

    • 只读:不能修改。
    • 不可变:一旦编译就固定下来。
    • 文本区通常用于存储程序的机器代码,不允许修改,以保护程序的完整性。
  • 示例

void print_hello() {
    printf("Hello, World!\n");  // 存储在文本区
}
5. BSS 区 (Block Started by Symbol)

BSS区用于未初始化的全局变量和静态变量。这些变量在程序启动时自动初始化为零。

理解这些内存区域对于有效地管理内存、避免内存泄漏和编写高性能的C程序非常重要。正确使用这些内存区域可以帮助你写出更加健壮和可靠的程序。

   理解这些内存区域对于有效地管理内存、避免内存泄漏和编写高性能的C程序非常重要。正确使用这些内存区域可以帮助你写出更加健壮和可靠的程序。那我们下期再见。

  • 特点

    • 生命周期长:整个程序期间都存在。
    • 初始值为零:未初始化的全局变量和静态变量。
    • BSS区通常用于存储未初始化的大对象,如大型数组。
    • BSS区的大小并不占用实际的物理内存,而是在程序加载时由操作系统分配。
  • 示例

    int uninitialized_global;  // 存储在BSS区
    static int uninitialized_static;  // 存储在BSS区

    总结

  • 栈区:用于存储局部变量和函数参数。
  • 堆区:用于动态分配内存。
  • 静态区:用于存储全局变量、静态变量和常量。
  • 文本区:存储程序的代码段。
  • BSS区:存储未初始化的全局变量和静态变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值