鱼C论坛

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

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

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

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

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

x
#include<stdio.h>
#include<stdlib.h>
int fun(int *p1,int *p2,int *s)
{
        s=(int*)malloc(sizeof(int));
        if((int*)malloc(sizeof(int))==NULL)
        {
                printf("error");
                exit(1);
        }
        *s=*p1 + *p2; 
 return *s;
 free(s);
 } 
 main()
 {
         int a[2]={1,2},b[2]={10,20},*s=a;
         fun(a,b,s);
         printf("%d\n",*s);
          
 }
这个返回值为什么是1,而不是11啊?
最佳答案
2018-8-6 12:17:03
QQ拼音截图20180806121602.png
。。累死人了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

嘶。。。有点深奥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

等于说是s被修改成了指向别的内存,形参*s相当于和传进来的实参脱钩了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

传值调用啊,该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。实参已经被赋值为1了,所以返回的还是1。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-6 12:17:03 | 显示全部楼层    本楼为最佳答案   
QQ拼音截图20180806121602.png
。。累死人了。
想知道小甲鱼最近在做啥?请访问 -> 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; 其实那对调试是有帮助的。不要省那一行字。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-2 08:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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