对于《高质量C/C++编程》,想必这个已经是早已成名的经典书籍了!!在此,笔者借用两三个题目!!
解析下面代码:(错误示列,请勿模仿)正确的代码,在后面部分!!!
#include <stdio.h>
char* getmemry()
{
char pc[] = "hello world";
return pc;
}
void test()
{
char* str = NULL;
str = getmemry();
printf(str);
}
int main()
{
test();
return 0;
}
对于这个代码,是一个错误的!!下面请看代码的运行结果:(大大出乎意料)
下面进入该段代码的解析部分:
在test函数里面,定义了str,str里面存放的是NULL(空指针),然后通过调用getmemry函数,在getmemry函数内部创建了一个局部的数组p,数组p里面存放了“hello world",p是数组名,表示数组的首元素的地址,return p;返回的是”h"的地址,假设地址为:0x0012ff40,则str里面存放的为:0x12ff40;即指向hello world ;对于上面的内容看似想象的确实挺不错的,但是遗憾的是:char pc[] = "hello world"; 是一个局部的数组,在进这个函数的时候创建,在出这个函数的时候,就销毁了,而所谓的销毁就是:将那一块空间的内容还给操作系统了,其空间的使用权限归操作系统,但是,那个地址,还是那个地址,没有发生变化!!!所以上面代码的运行结果出现了错误!!
因此,我们要返回栈空间的变量(正确)
#include <stdio.h>
int test()
{
int a = 10;
return a;
}
int main()
{
int ret = test();
printf("ret=%d\n", ret);
}
上面的这个就是我们所熟知的函数的调用简单代码!!并且是正确的写法!!代码的运行结果为:
但是,当我们返回栈空间地址的话,就会出现错误!!(错误写法)
//错误代码!!
#include <stdio.h>
int test()
{
int a = 10;
return &a;
}
int main()
{
int* ret = test();
printf("ret=%d\n", *ret);
}
代码运行不起来,直接崩溃!!
解析:在test函数中,a出函数的时候,就被销毁了,ret记录下的位置,已经没有啥用了,是一个野指针!!ret所指向的空间已经释放掉了,但是当打印结果为10时,只能说明,恰好没被修改,但是,代码仍然是错误的!!!