鱼C论坛

 找回密码
 立即注册
查看: 958|回复: 3

[已解决]迷之问题

[复制链接]
发表于 2020-11-1 11:04:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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:55:41
第一段代码中,func() 之后没有发生函数调用,所以 *p 指向的还是 100
第二段代码中,func() 之后调用了一次 printf(),函数栈被重新写入,所以 *p 指向的是一个奇怪的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-1 12:50:46 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-11-1 12:53 编辑

兄弟还真是个人才,搁这玩函数栈呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-1 12:55:41 | 显示全部楼层    本楼为最佳答案   
第一段代码中,func() 之后没有发生函数调用,所以 *p 指向的还是 100
第二段代码中,func() 之后调用了一次 printf(),函数栈被重新写入,所以 *p 指向的是一个奇怪的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-1 12:57:12 | 显示全部楼层
       两段代码无任何区别。
       函数 func() 返回的是一个局部变量的地址,这种操作是非法的。因为在调用 func() 的时候,系统会为函数的所有局部变量临时分配内存空间,在退出的时候,这些空间会被立即收回,也就是说,表达式 int *p = func() 执行过后,p 所指向的内存地址已经不再属于 func() 的局部变量 n 了,* p 也不再是预期的整型数 100 了(即便是,那也纯属偶然),所以,这样写代码注定是错误的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 19:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表