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:另外一个一样,不再重复

...

 

posted @ 2019-06-23 08:33  大黄蜂_001  阅读(143)  评论(0编辑  收藏  举报