C语言模型:内存四区模型和函数调用模型

本文详细介绍了程序运行时的内存分区,包括栈区、堆区、全局区、常量区及程序代码区的功能与特点,并通过示例代码展示了不同内存区域的使用方法。

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

数据类型可理解为创建变量的模具(模子);是固定内存大小的别名。

数据类型的作用:编译器预算对象(变量)分配的内存空间大小。

既能读又能写的内存对象,称为变量;若一旦初始化后不能修改的对象则称为常量。

变量本质:(一段连续)内存空间的别名。

内存四区
这里写图片描述

栈区(stack):也叫临时区,由编译器自动分配释放,存放函数的参数值,局部变量的值等。

堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收。
这里写图片描述
全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,该区域在程序结束后由操作系统释放。

常量区:字符串常量和其他常量的存储位置,程序结束后由操作系统释放

程序代码区:存放函数体的二进制代码。

/*
变量生命周期示例
*/
#include "stdafx.h"
#include <stdio.h>
#include<stdlib.h>

/*
访问栈区
*/
int visitStackArea(){
    printf("-----------------visitStackArea()---------------------\n");
    int a = 10;
    printf("a的地址 %d\n",&a);
    return a;
}

/*
访问全局区
*/
char* visitGlobalArea(){
    printf("----------------visitGlobalArea()----------------------\n");
    char *str = "abcdefg";
    printf(" visitGlobalArea() str的地址是: %d\n",str);
    return str;
}

/*
访问堆区
*/
int* visitHeapArea(){
    printf("-----------------visitHeapArea()---------------------\n");
    int* chs = NULL;

    chs = (int*) malloc(sizeof(int)*10);
    for(int i=0; i<10; i++){
        *(chs+i) = i;
    }
    printf(" visitHeapArea() chs的地址是: %d\n",chs);
    return chs;
}
int main(){

    int a = visitStackArea();
    printf("main通过visitStackArea()得到a的值, a的地址是:  %d\n",&a);

    char* str = visitGlobalArea();
    printf("main通过visitGlobalArea()得到str的值, str的地址是: %d\n",str);

    int* chs = visitHeapArea();
    printf("main通过visitHeapArea()得到的chs的值, chs的地址是: %d\n",chs);
    free(chs);
    return 0;
}
运行结果:

-----------------visitStackArea()---------------------
a的地址 3209584
main通过visitStackArea()得到a的值, a的地址是:  3209836
----------------visitGlobalArea()----------------------
 visitGlobalArea() str的地址是: 20470000
main通过visitGlobalArea()得到str的值, str的地址是: 20470000
-----------------visitHeapArea()---------------------
 visitHeapArea() chs的地址是: 7573184
main通过visitHeapArea()得到的chs的值, chs的地址是: 7573184
请按任意键继续. . .

函数调用模型

函数1调用函数2,函数1称为主调函数函数2称为被调用函数。

这里写图片描述
Main(主调函数)分配的内存(在堆区,栈区、全局区)都可以在被调用函数里使用。

C/C++可以在临时区分配内存,但是用完后被系统清了。

如果在被调用函数里面的临时区(栈)分配内存,主调用函数是不能使用的。

要弄清是主调函数分配内存,还是被调用函数分配内存。

主调函数如何使用被调用函数分配的内存(技术关键点:指针做函数参数)。

Heap、stack生长方向和内存存放方向是两个不同概念。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值