一、首先看一道面试题
这个函数有什么问题?请指出。[美国著名硬盘公司2008年4月面试题]
char *strA()
{
char str[]="Hello,World!!";
return str;
}
答案:因为这个函数返回的是局部变量的地址,当调用这个函数后,这个局部变量str就释放了,所以返回的结果是不确定且不安全的。
一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。
自动变量只有三种存储方式,分别是数据段或者bss段(静态局部变量);存储在寄存器中(寄存器变量);存储在栈中(一般的自动变量)。由于绝大多数自动变量都存储在栈中,所以自动变量的作用域往往只在函数内,其生命周期往往只持续到函数调用结束。
由于指针指向的内容还留在栈帧上,函数只是将其地址返回。因此如果栈帧被其他函数覆盖,返回的指针指向的内存区域的值也就消失了。如下图