C语言中关于数组名作为函数参数方面的问题

可能有点长,请大家给一点时间耐心看下哈,我最经对于指针,数组,函数参数等问题很纠结#include<stdio.h>#include<stdlib.h>voidfun(i... 可能有点长,请大家给一点时间耐心看下哈,我最经对于指针,数组,函数参数等问题很纠结
#include<stdio.h>
#include<stdlib.h>
void fun(int *p1,int *p2,int *s)
{ s=(int*)malloc(sizeof(int) );
*s=*p1+*(p2++);
}
main()
{ int a[2]={1,2},b[2]={10,20},*s=a;
fun(a,b,s);
printf("%d\n",*s);
}
这是原始程序,其运行结果是1。 可当我删除掉第二个语句和第四个语句后,答案却变成了11,请问这两者的原理是什么?原始程序解释说执行FUN函数后S的值并没有发生变化,仍然指向a,可是函数的第5个语句没有把它的值改变吗?
展开
 我来答
百度网友1b4425d
推荐于2016-05-20 · TA获得超过155个赞
知道答主
回答量:150
采纳率:0%
帮助的人:65万
展开全部

不知道你说的第2,4,5语句对应的是什么。。。。

帮你解释为什么是1:

  1. 当你调用fun(a,b,s);

    传进的参数实际上是:&a[0], &b[0], s变量的值(实际上也就是&a[0])

  2. 现在我们把fun的形参换个名字  fun(int *p1, int *p2, int *p3)

    进入fun时 p3 = s ,即p3 = &a[0].

    你调用malloc时返回的值是一个int*,实际上 p3 = malloc返回的新指针p4

    *p3=*p1+*(p2++)   即  *p4=*p1+*(p2++); 

    看到错误了吗,p4并不是s,你算出来的值赋值到malloc返回的指针p4指向的内存了。

  3. 你想p3(即你的s)拿到计算的值,请把s=(int*)malloc(sizeof(int) );这句去掉。

  4. 另外malloc出来的内存是需要释放的,请调用free释放,不然程序不退出的情况下内存会占用。

追问
噢,那如果我不删除  s=(int*)malloc(sizeof(int) );  这句话,我可不可以添加什么语句,还得到我函数中计算的值呢?
追答
你删除就最好啦,编程不就是跑的越快越好吗。如果你硬要的话可以这样改:
void fun(int *p1,int *p2,int *s)
{
int * a;

a=(int*)malloc(sizeof(int) );
*a=*p1+*(p2++);
*s = *a;
}
寂寞土人2009
2014-03-14
知道答主
回答量:9
采纳率:0%
帮助的人:6.3万
展开全部
s=(int*)malloc(sizeof(int)这句分配了一个动态地址,所以已经把指向改变。所以执行FUN函数后S的值没变
追问
指向改变是指哪了?那么原来它本指向a的,此时A的值有改变吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
元飞珍DR
2014-03-14 · TA获得超过2429个赞
知道小有建树答主
回答量:309
采纳率:95%
帮助的人:125万
展开全部
主程序中的s和fun程序中的s完全是两个毫不相关的指针变量,你可以看成是int *s_m和int *s_f

s_m指针在fun程序调用的那一时刻出来打了下酱油(用来赋值给s_f:s_f = s_m;),后来在fun程序体中:s=(int*)malloc(sizeof(int) ); 这一句的时候,s_m被抛弃了,此时s_f 指向新申请的动态空间了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
白花恋歌
2014-03-14 · 超过10用户采纳过TA的回答
知道答主
回答量:49
采纳率:100%
帮助的人:15.8万
展开全部
因为C语言函数采用的是传值调用,指针作参数时传递给函数的我们给个命名比如S',这时S'==S,然后申请了一块动态内存,申请成功的话会把指针传递给S',然后*s‘=*p1+*(p2++),所以。。。会产生内存泄漏。。。还有就是申请动态内存之后一定要检查申请内存是否成功,加一个NULL判断

至于你说的第二句和第四句不知道你说的是什么,以上都是猜测,你参考下吧
至于s,它一直指向的是a[0],没有变过
你要改的话就直接删除掉动态内存那一句,这样的话,S和S'都是指向a[0]的,当a[0]改变了的时候,S读取那段内存也会得到改变后的值,不过这样的话a[0]也会由1变成11
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式