程序的内存结构

6 篇文章 0 订阅
2 篇文章 0 订阅
#include <stdio.h>  
#include <stdlib.h>  
  
int globalVar = 10; // 全局变量,存放在数据区  
  
void func() {  
    static int staticVar = 20; // 静态局部变量,存放在数据区  
    int localVar = 30; // 局部变量,存放在栈区  
    int* heapVar = (int*)malloc(sizeof(int)); // 动态分配的内存,存放在堆区  
    if (heapVar != NULL) {  
        *heapVar = 40;  
        free(heapVar); // 释放堆区内存  
    }  
}  
  
int main() {  
    func();  
    return 0;  
}

一个典型的程序在运行时,其内存结构可以大致划分为以下几个区域:

  1. 代码区(Code Segment)
    • 内容:存放CPU执行的机器指令,即程序代码。
    • 特点:代码区是只读的,以防止程序意外修改其指令。
    • 示例:函数体、字符串常量等。
  2. 数据区(Data Segment)
    • 数据区进一步细分为几个子区域,包括全局变量区、静态变量区等。
    • 全局变量区:存放全局变量和静态全局变量。这些变量在程序启动时被分配内存,并在程序结束时由操作系统释放。
    • 静态变量区:包括静态局部变量和静态全局变量。静态局部变量在函数调用结束后不释放,其值在下次函数调用时保持不变。静态全局变量只在本文件内可见。
    • 特点:数据区中的变量在程序运行期间一直存在,直到程序结束。
  3. 栈区(Stack Segment)
    • 内容:用于存放函数的局部变量、函数参数、返回地址等。
    • 特点:栈是一种后进先出(LIFO)的数据结构,由编译器自动管理。函数调用时,会在栈上为其局部变量分配空间;函数返回时,这些空间会被自动释放。
    • 限制:栈的大小有限,通常由操作系统在程序启动时确定,超出限制会导致栈溢出。
  4. 堆区(Heap Segment)
    • 内容:用于存放程序运行期间动态分配的内存。
    • 特点:堆区由程序员手动管理,通过malloccallocrealloc等函数分配内存,通过free函数释放内存。堆区的大小相对较大,但管理复杂,容易出现内存泄漏等问题。
    • 用途:适合存储大小不确定或生命周期与函数调用无关的数据。
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值