一道数组问题
本帖最后由 百变kelvin 于 2016-8-7 14:19 编辑#include<stdio.h>
void fun(int *p1, int *p2, int *s)
{
s = (int*)calloc(1, sizeof(int));
*s = *p1 + *p2;
free(s);
}
main()
{
int a = {1, 2}, b = {40, 50}, *q = a;
fun(a, b ,q);
printf("%d\n", *q);
}
程序的输出结果是 1
是怎么得到这个结果的呢,感觉fun函数没有执行呢?还请大家给个详细的指导过程,感激不尽。 你是怎么编译的?include后没有包含文件,main没有定义,fun,main都没有返回,free()又在哪? #include<stdio.h>
#include<stdlib.h>
void fun ( int *p1, int *p2, int *s)
{
s = ( int* )calloc(1, sizeof( int ));//申请新的内存地址
*s = *p1 + *p2;
free(s);//释放
}
int main()
{
//定义a,b两个数组,将指针q指向a数组
int a = {1, 2}, b = {40, 50}, *q = a;
//进入函数调用,其中ab数组是形参
fun( a, b ,q );//实际上q根本没有改变、就是a的数组的地址
printf( "%d\n", *q );//所以输出数组a的第一个值1
return 0;
}
个人认为这个代码应该是想实现数组相加的值吧
注释掉fun函数里的重新分配内存函数就行了、
#include<stdio.h>
#include<stdlib.h>
void fun ( int *p1, int *p2, int *s)
{
//s = ( int* )calloc(1, sizeof( int ));//申请新的内存地址
*s = *p1 + *p2;
//free(s);//释放
}
int main()
{
//定义a,b两个数组,将指针q指向a数组
int a = {1, 2}, b = {40, 50}, *q = a;
//进入函数调用,其中ab数组是形参
fun( a, b ,q );
printf( "%d\n", *q );
return 0;
}
花开自有丶花落 发表于 2016-8-6 16:22
你是怎么编译的?include后没有包含文件,main没有定义,fun,main都没有返回,free()又在哪?
这只是一道题目里的题,给出的代码肯定不会完整的,重点看主要代码就行啦。只是单纯编译并不能学到什么。 lx_Zz 发表于 2016-8-6 18:09
个人认为这个代码应该是想实现数组相加的值吧
注释掉fun函数里的重新分配内存函数就行了、
这一个*s = *p1 + *p2只是起到分配地址的作用,不是值相加是吗,它输出*q,然后a的值赋给*q,那它为什么是取a中的1的呢? 函数里给s重新赋值了,并没有改变*q的内容,他依然指向a=1 实参没变 看看 fun函数先分配内存地址,后又释放,实质上fun函数不起作用,所以q指向数组a的其实位置。 看图说话:
看图:上半部分的是main函数;下半部分是fun函数
int *q = a;
//这句代码就是把数组a的首元素地址( 即&a )放到指针变量q的内存里(任何一个变量只要定义了就会有自己的内存);
fun(a, b, q);
//执行到这句时就是把数组a的首元素地址、数组b的首元素地址、和指针变量q存储的值( &a )分别传递给
//fun函数的三个指针变量p1、p2、p3
//然后fun函数里的三个指针的指向就如图所示
继续看图:
main函数里的指针变量q的指向依旧没有改变;还是指向数组a的首元素地址 看看 首先哈,你的q指向的a的首地址,也就是1,应为你传入的不是q的引用,所以被调用的函数形参列表那边也会创建一个跟q一样的指针,你用它才申请一个堆站内存,保存相乘的结果,之后又释放了,并不会影响main函数传入的指针的值。 就是这么简单,你自己单部追踪一下就OK了。 {:10_257:}{:10_257:}我怎么看这个程序应该怎么报错,你吧指针作为实参,最主要的形参也是和他同级别的指针,不报错真的挺奇迹的{:10_257:} 在fun函数里,计算结果的值被放在了calloc申请的内存里,但是fun结束时,被free掉了,可以使用二级指针,把p的地址传进来
页:
[1]