C语言复习第二章:深入了解内存四区

综述

C语言程序中,代码是放在内存中执行的,我们大致将程序所占用的内存分为四个区域:栈区 堆区 全局区 代码区 每个程序都有唯一 一个内存四区,我们应该掌握各个区域的特性,例如存储哪种类型的数据,由谁去申请开辟,又由谁去管理释放等等。这是一张内存四区基本知识的图,通常把全局区和常量区放在一起

1.栈区

//栈区     非法操作内存
char *getMem2()
{
    char buf[64];//栈区
    strcpy(buf,"123456");//"12345"放在全局区

    return buf; //在return时被回收  返回的是buf的首地址 但该地址已经不属于buf了
}

int main()
{
    char *tmp = NULL;//栈区

    tmp = getMem2();

    printf("tmp2:%s.\n",tmp);//每次运行结果都不同 该地址保存的内容 不是buf保存的

    return 0;
}

2.堆区

//堆区   
char *getMem1(int num)
{
    char *buf = NULL;//栈区
    buf = (char *)malloc(sizeof  num);//申请堆空间
    
    if(buf == NULL)
    {
        return NULL;
    }
    return buf;//在程序结束后由操作系统回收  函数执行完该空间还在
}

int main()
{
    char *tmp = NULL;//栈区
    tmp = getMem1(10);
    
    if(tmp == NULL)
    {
        return ;
    }

    strcpy(tmp,"123");"字符串写到堆空间"

    printf("tmp1:%s.\n",tmp);//固定结果 123
    
}

3.全局区

#include<stdio.h>


char *getstr1()
{
    char *t1 = "qwe2";
    return t1;
}


char *getstr2()
{
    char *t2 = "qwe2";//换成qwe1再运行一下
    return t2;
}

int main()
{
    char *p1 = NULL;
    char *p2 = NULL;

    p1 = getstr1();
    p2 = getstr2();
	
	//当 getstr1和getstr2 所指向的不同 会有不同的结果
    printf("p1:%s\tp2%s\n",p1,p2);
    printf("p1:%d\tp2:%d\n",p1,p2);
    
    return 0;
}

解释:

在getstr1和getstr2所指向的内容相同时,在全局区只保存一次,打印出的内容和地址都相同.
在getstr1和getstr2所指向的内容不同时,全局区分别保存,打印出的地址可能相邻,也可能随机.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值