迷之问题
本帖最后由 4399king 于 2020-11-1 11:05 编辑//代码1
#include <stdio.h>
int *func(){
int n = 100;
return &n;
}
int main(){
int *p = func(), n;
n = *p;
printf("value = %d\n", n);
return 0;
}
//代码2
#include <stdio.h>
int *func(){
int n = 100;
return &n;
}
int main(){
int *p = func(), n;
printf("c指针真有趣\n");
n = *p;
printf("value = %d\n", n);
return 0;
},
请说出两段代码的区别并解释原因 本帖最后由 永恒的蓝色梦想 于 2020-11-1 12:53 编辑
兄弟还真是个人才,搁这玩函数栈呢? 第一段代码中,func() 之后没有发生函数调用,所以 *p 指向的还是 100
第二段代码中,func() 之后调用了一次 printf(),函数栈被重新写入,所以 *p 指向的是一个奇怪的值 两段代码无任何区别。
函数 func() 返回的是一个局部变量的地址,这种操作是非法的。因为在调用 func() 的时候,系统会为函数的所有局部变量临时分配内存空间,在退出的时候,这些空间会被立即收回,也就是说,表达式 int *p = func() 执行过后,p 所指向的内存地址已经不再属于 func() 的局部变量 n 了,* p 也不再是预期的整型数 100 了(即便是,那也纯属偶然),所以,这样写代码注定是错误的!
页:
[1]