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个语句没有把它的值改变吗? 展开
#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个语句没有把它的值改变吗? 展开
4个回答
展开全部
不知道你说的第2,4,5语句对应的是什么。。。。
帮你解释为什么是1:
当你调用fun(a,b,s);
传进的参数实际上是:&a[0], &b[0], s变量的值(实际上也就是&a[0])
现在我们把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指向的内存了。
你想p3(即你的s)拿到计算的值,请把s=(int*)malloc(sizeof(int) );这句去掉。
另外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;
}
展开全部
s=(int*)malloc(sizeof(int)这句分配了一个动态地址,所以已经把指向改变。所以执行FUN函数后S的值没变
追问
指向改变是指哪了?那么原来它本指向a的,此时A的值有改变吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
主程序中的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 指向新申请的动态空间了。
s_m指针在fun程序调用的那一时刻出来打了下酱油(用来赋值给s_f:s_f = s_m;),后来在fun程序体中:s=(int*)malloc(sizeof(int) ); 这一句的时候,s_m被抛弃了,此时s_f 指向新申请的动态空间了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为C语言函数采用的是传值调用,指针作参数时传递给函数的我们给个命名比如S',这时S'==S,然后申请了一块动态内存,申请成功的话会把指针传递给S',然后*s‘=*p1+*(p2++),所以。。。会产生内存泄漏。。。还有就是申请动态内存之后一定要检查申请内存是否成功,加一个NULL判断
至于你说的第二句和第四句不知道你说的是什么,以上都是猜测,你参考下吧
至于s,它一直指向的是a[0],没有变过
你要改的话就直接删除掉动态内存那一句,这样的话,S和S'都是指向a[0]的,当a[0]改变了的时候,S读取那段内存也会得到改变后的值,不过这样的话a[0]也会由1变成11
至于你说的第二句和第四句不知道你说的是什么,以上都是猜测,你参考下吧
至于s,它一直指向的是a[0],没有变过
你要改的话就直接删除掉动态内存那一句,这样的话,S和S'都是指向a[0]的,当a[0]改变了的时候,S读取那段内存也会得到改变后的值,不过这样的话a[0]也会由1变成11
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询