llovenova 发表于 2018-8-6 09:55:23

这个返回值一直不理解

#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={1,2},b={10,20},*s=a;
        fun(a,b,s);
        printf("%d\n",*s);
       
}这个返回值为什么是1,而不是11啊?

无符号整形 发表于 2018-8-6 10:15:31

因为第五行*s已经被修改了。
函数的*s已经不是外面的*s了(外面的*s还在,里面的*s被修改了,所以加法就在里面的*s进行了)
这时相当于*s根本就没有被修改。

llovenova 发表于 2018-8-6 10:42:40

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

嘶。。。有点深奥

无符号整形 发表于 2018-8-6 10:47:12

llovenova 发表于 2018-8-6 10:42
嘶。。。有点深奥

等于说是s被修改成了指向别的内存,形参*s相当于和传进来的实参脱钩了。

TIian 发表于 2018-8-6 11:59:22

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

传值调用啊,该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。实参已经被赋值为1了,所以返回的还是1。

关键是感觉 发表于 2018-8-6 12:17:03


。。累死人了。

claws0n 发表于 2018-8-6 12:52:00

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

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

楼主:
把 fun 里面的 malloc 与 free 删除就可以了。另外,最好写上 int main() 与 return 0; 其实那对调试是有帮助的。不要省那一行字。

关键是感觉 发表于 2018-8-6 14:47:07

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

其实我以前也认为有实参和形参的差距,毕竟书上都这样描述。其实在本质上。都是值的传递,一样在栈中开辟内存单元保存传递进来的参数。都是值的拷贝。翁恺C语言有说

claws0n 发表于 2018-8-6 14:56:14

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

所以我的理解没有错吧??
一般上这种指针操作是在栈的,完成后就被弹掉,根本没有必要申请内存。他的程序其实是有执行相加的部分,但是最后被释放掉了,所以打回原形
页: [1]
查看完整版本: 这个返回值一直不理解