读书人

一个小程序为啥调试和运行的结果不同

发布时间: 2013-08-01 15:23:18 作者: rapoo

一个小程序,为什么调试和运行的结果不同?
#include <stdio.h>

char *fun( char *p )
{

char temp[]={0,1,2};
return (char *)(&temp);
}

void main()
{
char i;
char temp[5] = {0,1,2,3,4};
char *q;
q = fun(temp);
for(i=0;i<3;i++)
printf("%d\n",*(q+i));
}

调试查看发现*(q+0)=0,*(q+1)=1,*(q+2)=2;但为什么我Printf出来的结果却是乱码的? 调试 printf
[解决办法]
退栈不包括清理数据

就是调用函数后所说的清理堆栈,这里的清理堆栈实际上指的是平衡栈,而不是说把用过的地方填充什么数据,仅仅是调整ESP回到调用函数前(压入参数前)的位置而已

所以在函数中返回了一个局部字串的指针就算函数返回了数据其实还在,但它的位置是无效的(随时可能被其它函数使用)
这就是为什么你可以得到函数返回后的局部变量,因为那块内存没有被修改

当调用下一个函数B的时候,栈就交给了函数B,函数B如果使用的栈覆盖过原来的那个函数,那显然数据是被修改了,这就是为什么你用 q = fun(temp); 还能得到原来的局部变量,但调用printf时却变了。

读书人网 >C语言

热点推荐