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