问题描述
- 初学C语言,一个小问题
-
#include
#include
void fun(float *p1,float *p2,float *s)
{s=(float *)calloc(1,sizeof(float));
*s=*p1+*p2++;
}
void main()
{float a[2]={1.1,2.2},b[2]={10.0,20.0},*s=b;
fun(a,b,s);printf("%5.2fn",*s);
}
为什么程序的结果是10.00呢?
解决方案
因为fun函数中float *s _只能改变s指向地址的值,针对本身地址的指向不会做改变。
所以函数中对s重新calloc,只是在函数域中自动为s重新创建一个临时的空间,这时的s就不再是实参指向的s(main函数中)了,可以简单的认为是函数域自己的一个局部变量s指向了一块临时空间,之后的操作只是对临时空间的操作,并不会影响实参s,即main函数中float *s_。
要想改变main函数中s的值,没必要在函数中重新对s分配一块空间:
void fun(float *p1,float *p2,float *s)
{
*s=*p1+*p2++;
}
解决方案二:
s 在函数中分配的地址,只在函数中有效,出了函数就无效了。想有效,必须 使用指向指针的指针。
解决方案三:
因为fun函数中float *s _只能改变s指向地址的值,针对本身地址的指向不会做改变。
所以函数中对s重新calloc,只是在函数域中自动为s重新创建一个临时的空间,这时的s就不再是实参指向的s(main函数中)了,可以简单的认为是函数域自己的一个局部变量s指向了一块临时空间,之后的操作只是对临时空间的操作,并不会影响实参s,即main函数中float *s_。
要想改变main函数中s的值,没必要在函数中重新对s分配一块空间:
void fun(float *p1,float *p2,float *s)
{
*s=*p1+*p2++;
}
解决方案四:
局部变量函数结束后就释放了
解决方案五:
这个还是蛮重要的概念 楼上那些人说的对,要想改变p的值就要用1.指针的指针传入函数。2.用return返回一个值,在main中有变量接受
好好学,我也是菜鸟,加油~
解决方案六:
你的函数其实什么都没做,就是相当于输出*s ,*s取的是b的首地址,那你觉得*s除了输出10还想输出什么???
解决方案七:
一开始s=b[0],然后将s地址传给fun函数,但是fun中为s重新开辟空间,返回main函数后其实s原来空间的值没有改变
解决方案八:
一开始s=b[0],然后将s地址传给fun函数,但是fun中为s重新开辟空间,返回main函数后其实s原来空间的值没有改变
解决方案九:
像calloc,malloc函数分配的是堆空间,动态的,是不能返回地址的。其实你想要它返回地址,只要给子函数传一个二级指针过去就行了,如下:
void main()
{
float a[2]={1.1,2.2},b[2]={10.0,20.0},*s=b;
fun(a,b, &s);printf("%5.2fn",*s);
}
解决方案十:
子函数中改成:
*s=(float *)calloc(1,sizeof(float));