百变kelvin 发表于 2016-8-6 16:05:46

一道数组问题

本帖最后由 百变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函数没有执行呢?还请大家给个详细的指导过程,感激不尽。

花开自有丶花落 发表于 2016-8-6 16:22:53

你是怎么编译的?include后没有包含文件,main没有定义,fun,main都没有返回,free()又在哪?

lx_Zz 发表于 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 = {1, 2}, b = {40, 50}, *q = a;
    //进入函数调用,其中ab数组是形参
    fun( a, b ,q );//实际上q根本没有改变、就是a的数组的地址
    printf( "%d\n", *q );//所以输出数组a的第一个值1
    return 0;
}

lx_Zz 发表于 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 = {1, 2}, b = {40, 50}, *q = a;
    //进入函数调用,其中ab数组是形参
    fun( a, b ,q );
    printf( "%d\n", *q );
    return 0;
}

百变kelvin 发表于 2016-8-7 13:37:17

花开自有丶花落 发表于 2016-8-6 16:22
你是怎么编译的?include后没有包含文件,main没有定义,fun,main都没有返回,free()又在哪?

这只是一道题目里的题,给出的代码肯定不会完整的,重点看主要代码就行啦。只是单纯编译并不能学到什么。

百变kelvin 发表于 2016-8-7 13:40:36

lx_Zz 发表于 2016-8-6 18:09
个人认为这个代码应该是想实现数组相加的值吧
注释掉fun函数里的重新分配内存函数就行了、

这一个*s = *p1 + *p2只是起到分配地址的作用,不是值相加是吗,它输出*q,然后a的值赋给*q,那它为什么是取a中的1的呢?

Krant5 发表于 2016-8-7 17:01:12

函数里给s重新赋值了,并没有改变*q的内容,他依然指向a=1

迷雾少年 发表于 2016-8-7 19:58:06

实参没变

cosmosh73 发表于 2016-8-22 09:03:13

看看

iszhuangsha 发表于 2016-8-22 11:31:40

fun函数先分配内存地址,后又释放,实质上fun函数不起作用,所以q指向数组a的其实位置。

18813974736 发表于 2016-8-30 19:41:40

看图说话:
看图:上半部分的是main函数;下半部分是fun函数
int *q = a;
//这句代码就是把数组a的首元素地址( 即&a )放到指针变量q的内存里(任何一个变量只要定义了就会有自己的内存);

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


18813974736 发表于 2016-8-30 19:45:16

继续看图:
main函数里的指针变量q的指向依旧没有改变;还是指向数组a的首元素地址

cosmosh73 发表于 2016-8-31 11:29:05

看看

1366627538 发表于 2016-9-2 08:17:41

首先哈,你的q指向的a的首地址,也就是1,应为你传入的不是q的引用,所以被调用的函数形参列表那边也会创建一个跟q一样的指针,你用它才申请一个堆站内存,保存相乘的结果,之后又释放了,并不会影响main函数传入的指针的值。 就是这么简单,你自己单部追踪一下就OK了。

Jessie~~ 发表于 2016-9-5 20:29:51

aclii 发表于 2016-9-22 23:12:48

{:10_257:}{:10_257:}我怎么看这个程序应该怎么报错,你吧指针作为实参,最主要的形参也是和他同级别的指针,不报错真的挺奇迹的{:10_257:}

heblhc 发表于 2016-9-23 10:14:04

在fun函数里,计算结果的值被放在了calloc申请的内存里,但是fun结束时,被free掉了,可以使用二级指针,把p的地址传进来
页: [1]
查看完整版本: 一道数组问题