鱼C论坛

 找回密码
 立即注册
查看: 2283|回复: 8

[已解决]这个返回值一直不理解

[复制链接]
发表于 2018-8-6 09:55:23 | 显示全部楼层 |阅读模式

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

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

x
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int fun(int *p1,int *p2,int *s)
  4. {
  5.         s=(int*)malloc(sizeof(int));
  6.         if((int*)malloc(sizeof(int))==NULL)
  7.         {
  8.                 printf("error");
  9.                 exit(1);
  10.         }
  11.         *s=*p1 + *p2;
  12. return *s;
  13. free(s);
  14. }
  15. main()
  16. {
  17.         int a[2]={1,2},b[2]={10,20},*s=a;
  18.         fun(a,b,s);
  19.         printf("%d\n",*s);
  20.          
  21. }
复制代码
这个返回值为什么是1,而不是11啊?
最佳答案
2018-8-6 12:17:03
QQ拼音截图20180806121602.png
。。累死人了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-8-6 10:15:31 | 显示全部楼层
因为第五行*s已经被修改了。
函数的*s已经不是外面的*s了(外面的*s还在,里面的*s被修改了,所以加法就在里面的*s进行了)
这时相当于*s根本就没有被修改。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-6 10:42:40 | 显示全部楼层
无符号整形 发表于 2018-8-6 10:15
因为第五行*s已经被修改了。
函数的*s已经不是外面的*s了(外面的*s还在,里面的*s被修改了,所以加法就在 ...

嘶。。。有点深奥
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-6 10:47:12 | 显示全部楼层
llovenova 发表于 2018-8-6 10:42
嘶。。。有点深奥

等于说是s被修改成了指向别的内存,形参*s相当于和传进来的实参脱钩了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-6 11:59:22 | 显示全部楼层
无符号整形 发表于 2018-8-6 10:15
因为第五行*s已经被修改了。
函数的*s已经不是外面的*s了(外面的*s还在,里面的*s被修改了,所以加法就在 ...

传值调用啊,该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。实参已经被赋值为1了,所以返回的还是1。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-6 12:17:03 | 显示全部楼层    本楼为最佳答案   
QQ拼音截图20180806121602.png
。。累死人了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-6 12:52:00 | 显示全部楼层
无符号整形 发表于 2018-8-6 10:47
等于说是s被修改成了指向别的内存,形参*s相当于和传进来的实参脱钩了。

我觉得问题是这样的:
我们不需要去管资料是在堆还是栈,变量是实参还是形参。最大的问题在于对 s 分配内存,然后将它释放。此时 s 是没有值的。因此第 19 行的 printf 在找不着新的 s 时(刚好是局部变量),就找到第 17 行的 *s = a == a[0] == 1。

楼主:
把 fun 里面的 malloc 与 free 删除就可以了。另外,最好写上 int main() 与 return 0; 其实那对调试是有帮助的。不要省那一行字。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-6 14:47:07 | 显示全部楼层
claws0n 发表于 2018-8-6 12:52
我觉得问题是这样的:
我们不需要去管资料是在堆还是栈,变量是实参还是形参。最大的问题在于对 s 分配 ...

其实我以前也认为有实参和形参的差距,毕竟书上都这样描述。其实在本质上。都是值的传递,一样在栈中开辟内存单元保存传递进来的参数。都是值的拷贝。翁恺C语言有说
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-6 14:56:14 | 显示全部楼层
关键是感觉 发表于 2018-8-6 14:47
其实我以前也认为有实参和形参的差距,毕竟书上都这样描述。其实在本质上。都是值的传递,一样在栈中开辟 ...

所以我的理解没有错吧??
一般上这种指针操作是在栈的,完成后就被弹掉,根本没有必要申请内存。他的程序其实是有执行相加的部分,但是最后被释放掉了,所以打回原形
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-7 11:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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