4399king 发表于 2020-11-1 11:04:06

迷之问题

本帖最后由 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:50:46

本帖最后由 永恒的蓝色梦想 于 2020-11-1 12:53 编辑

兄弟还真是个人才,搁这玩函数栈呢?

永恒的蓝色梦想 发表于 2020-11-1 12:55:41

第一段代码中,func() 之后没有发生函数调用,所以 *p 指向的还是 100
第二段代码中,func() 之后调用了一次 printf(),函数栈被重新写入,所以 *p 指向的是一个奇怪的值

jackz007 发表于 2020-11-1 12:57:12

       两段代码无任何区别。
       函数 func() 返回的是一个局部变量的地址,这种操作是非法的。因为在调用 func() 的时候,系统会为函数的所有局部变量临时分配内存空间,在退出的时候,这些空间会被立即收回,也就是说,表达式 int *p = func() 执行过后,p 所指向的内存地址已经不再属于 func() 的局部变量 n 了,* p 也不再是预期的整型数 100 了(即便是,那也纯属偶然),所以,这样写代码注定是错误的!
页: [1]
查看完整版本: 迷之问题