看几个例子
一个是经典的1+2=65534:
代码如下
#include <stdio.h>
#include <stdlib.h>
unsigned short *Sum( unsigned char a,unsigned char b)
{
unsigned short S=0;
S=a+b;
return &S;
}
int main()
{
unsigned short *p=NULL;
unsigned char a=1,b=2;
p=Sum(a,b);
printf("%u+%u",a,b);
printf("=%u\n",*p);
printf("=%u\n",p);
system("pause");
return 0;
}
这个&s,实际上返回了个指向局部变量的指针,而这个变量在栈上,在函数Sum调用完的时候,就被释放掉了,于是这个指针是指不到想要的值3的,
p=Sum(a,b);上面这个语句使p得到一个地址,这个地址指向一个曾经的局部变量,这个局部变量在函数Sum()返回后就被操作系统清理掉了。
这个程序的运行结果如下:
现在我们尝试将上面程序的
printf("%u+%u",a,b);
printf("=%u\n",*p);
这两句调换一下顺序,再运行会发现结果变成了:
printf("%u+%u",a,b);
再写
printf("=%u\n",*p);
这样第一句就把原来栈里面的结果"3"给覆盖掉了,所以得不出,于是我们做如下修改,把这两句用printf("%u+%u=%u\n",a,b,*p);来代替,看看结果:
发现第一行的结果是对的,这时候我们如果将
printf("%u+%u=%u\n",a,b,*p);
printf("%u+%u=%u\n",a,b,*p);
这样连写两行的话,会发现:
原理跟上面的一样
下面我们这样一段程序:
#include<stdio.h>
#include<stdlib.h>
char* check(void)
{
char *p = "abc\n";
return p;
}
int main()
{
char *temp = check();
printf("%s\n",temp);
printf("%c\n",*temp);
system("pause");
return 0;
}
#include<stdio.h>
#include<stdlib.h>
char* check(void)
{
char *p = "abc\n";
return p;
}
int main()
{
char *temp = check();
printf("%s\n",temp);
printf("%c\n",*temp);
system("pause");
return 0;
}