1.11内存四区(栈区)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning(disable:4996)

char *get_str3(){
    char a[] = "abce"; // "abce" : 文字常量区,    a:栈区
    return a;
}

int main(void){
    char zhan[100] = { 0 };
    /*
        打印出来的内容是不确定的,有可能是abce,有可是乱码.
        因为get_str3中的变量是保存在栈区的,运行程序是将文字常量拷贝到buff内部的。
        如果 get_str3()已经释放,这时候来个中断,就有可能导致乱码。
        在正式的工作中,最好不要遗留这些可能出bug的地方,
        (避免方法,将函数中的 a 定义成全局变量 或者 静态变量--此处没有验证)
    */
    strcpy(zhan, get_str3());
    printf("zhan(s) =%s\n", zhan);

    /*一个更好的验证方法,上一个有可能正好没释放时拷贝了,这个是释放后拷贝的,肯定是乱码*/
    zhan[0] = get_str3(); //buf内部内容未知
    printf("zhan(s) =%s\n", zhan);//乱码

    printf("\n");
    system("pause");
    return 0;
}

内存分析

【注:自己从老师讲解出理解的,不对的地方望指正】

【注:本程序验证是使用vs2013版】

前奏1:将代码放置代码区

前奏2:将全局变量找出来,abce作为文字常量,存放在全局区内

程序执行1:在栈区创建数组zhan

程序执行2:在栈区给 get_str3() 分配空间  

程序执行3:执行get_str3():在 get_str3() 的栈区空间内创建 数组a,并将文字常量 拷贝到数组a中

程序执行4:释放 get_str3() ,并返回一个栈地址

程序执行5:执行strcpy():将 get_str3()返回的栈地址的内容 依次的拷贝给 zhan数组。

程序执行6:另外一个一样,不再重复

...

 

转载于:https://www.cnblogs.com/wlstm/p/11071776.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值