calloc函数问题

来源:百度知道 编辑:UC知道 时间:2024/06/25 00:37:05
#include <stdio.h>
#include <stdlib.h>
void fun(float *p1,float *p2,float *s)
{s=(float *)calloc(1,sizeof(float));
*s=*p1+*p2;
}

main()
{float a[2]={1.1,2.2},b[2]={10.0,20.0},*s=a;
fun(a,b,s);
printf("%5.2f\n",*s);

}
如上,为什么我输出的结果是1.10??
为什么不是11.1?
在main中,将s指向了a,
然后,调用fun函数,在fun函数里,又将s重新指向了calloc了新开辟的单元
回到main里,在printf里*s代表的应该是calloc单元里的值,不是吗?
为什么代表的还是a[0]的值呢??
s是地址
记得地址作实参的时候,
其形参是引用
在函数体内作出的改变,会直接改变实参,不是么?

1L的朋友,malloc和calloc 不是要用free后才能被系统释放吗??

C语言默认是按值传递的,调用fun(a,b,s);后,把S所指向的地址传给形参,而S本本身并没有改变,所以还是a[0]的值
呵呵,这个怎么讲呢,传递指针的时候就好比传递一个盒子,盒子里面装的变量,这时候你只能改变"盒子"里面的值,而这个"盒子"还是按值传递的,不知道这么说你明白不,这个"盒子"就是指针的地址,反正是我明白,而且也就是这么回事,但是我讲的不一定明白,呵呵 ,我这阶段在线,你要还不明白的话我俩再研究

传值引用,其实指针和其他变量都一样,就是函数调用后其实s的值其实没有变,他还是指向a数组。就相当于创建了一个副本,那个副本指向新内存后改变了新内存的值,然后调用结束,副本销毁,内存的值发生了改变,但是你已经找不到这块地址了,s还是指向a。这是我的想法

在fun函数里,又将s重新指向了calloc了新开辟的单元
---------------------------------------------------
是的,但是我们都应该知道函数体类的变量会在函数结束的时候被回收掉。
就像 int fun(a){a = 10}; int b=20; fun(b); b的值是20 还是10,肯定是20,对吧。
道理是一样的,你把s又赋予了一个新的值,函数结束后不会改变它原本的值,而且你还造成了一块不可回收的内存,存在内存泄露。。。如果这个函数被反复调用就会使程序崩溃掉。。。。
------------------------------
你可以这样用。

#include <stdio.h>
#include <stdlib.h>
void fun(float *p1,float *p2,float *s)
{
*s=*p1+*p2;
}

main()
{float a[2]={1.1,2.2},b[2]={10.0,20.0},s=*a;
fun(a,b,&s);
printf("%5.2f\n",s);
}