鱼C论坛

 找回密码
 立即注册
查看: 2785|回复: 16

一道数组问题

[复制链接]
发表于 2016-8-6 16:05:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 百变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[2] = {1, 2}, b[2] = {40, 50}, *q = a;
        fun(a, b ,q);
        printf("%d\n", *q);
}

程序的输出结果是 1

是怎么得到这个结果的呢,感觉fun函数没有执行呢?还请大家给个详细的指导过程,感激不尽。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-6 16:22:53 | 显示全部楼层
你是怎么编译的?include后没有包含文件,main没有定义,fun,main都没有返回,free()又在哪?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-6 18:07:47 | 显示全部楼层
#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[2] = {1, 2}, b[2] = {40, 50}, *q = a;
    //进入函数调用,其中ab数组是形参
    fun( a, b ,q );//实际上q根本没有改变、就是a的数组的地址
    printf( "%d\n", *q );//所以输出数组a的第一个值1
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-6 18:09:48 | 显示全部楼层
个人认为这个代码应该是想实现数组相加的值吧
注释掉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[2] = {1, 2}, b[2] = {40, 50}, *q = a;
    //进入函数调用,其中ab数组是形参
    fun( a, b ,q );
    printf( "%d\n", *q );
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-7 13:37:17 | 显示全部楼层
花开自有丶花落 发表于 2016-8-6 16:22
你是怎么编译的?include后没有包含文件,main没有定义,fun,main都没有返回,free()又在哪?

这只是一道题目里的题,给出的代码肯定不会完整的,重点看主要代码就行啦。只是单纯编译并不能学到什么。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-7 13:40:36 | 显示全部楼层
lx_Zz 发表于 2016-8-6 18:09
个人认为这个代码应该是想实现数组相加的值吧
注释掉fun函数里的重新分配内存函数就行了、

这一个*s = *p1 + *p2只是起到分配地址的作用,不是值相加是吗,它输出*q,然后a的值赋给*q,那它为什么是取a中的1的呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-7 17:01:12 | 显示全部楼层
函数里给s重新赋值了,并没有改变*q的内容,他依然指向a[0]=1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-7 19:58:06 | 显示全部楼层
实参没变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-22 09:03:13 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-22 11:31:40 | 显示全部楼层
fun函数先分配内存地址,后又释放,实质上fun函数不起作用,所以q指向数组a的其实位置。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-30 19:41:40 | 显示全部楼层
看图说话:
看图:上半部分的是main函数;下半部分是fun函数
int *q = a;
//这句代码就是把数组a的首元素地址( 即&a[0] )放到指针变量q的内存里(任何一个变量只要定义了就会有自己的内存);

fun(a, b, q);
//执行到这句时就是把数组a的首元素地址、数组b的首元素地址、和指针变量q存储的值( &a[0] )分别传递给
//fun函数的三个指针变量p1、p2、p3
//然后fun函数里的三个指针的指向就如图所示


main函数调用fun函数传完实参时

main函数调用fun函数传完实参时
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-30 19:45:16 | 显示全部楼层
继续看图:
main函数里的指针变量q的指向依旧没有改变;还是指向数组a的首元素地址
calloc分配堆内存后.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-31 11:29:05 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-2 08:17:41 | 显示全部楼层
首先哈,你的q指向的a的首地址,也就是1,应为你传入的不是q的引用,所以被调用的函数形参列表那边也会创建一个跟q一样的指针,你用它才申请一个堆站内存,保存相乘的结果,之后又释放了,并不会影响main函数传入的指针的值。 就是这么简单,你自己单部追踪一下就OK了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2016-9-5 20:29:51 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-22 23:12:48 | 显示全部楼层
我怎么看这个程序应该怎么报错,你吧指针作为实参,最主要的形参也是和他同级别的指针,不报错真的挺奇迹的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-23 10:14:04 | 显示全部楼层
在fun函数里,计算结果的值被放在了calloc申请的内存里,但是fun结束时,被free掉了,可以使用二级指针,把p的地址传进来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-7-4 23:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表