开发者社区> 问答> 正文

C语言的函数参数问题看似简单, 其实有内涵?? 400 报错

C语言的函数参数问题看似简单, 其实有内涵?? 400 报错

void  change(int *a)

{

    a = malloc(sizeof(int));

    (*a) = 168;

}


int* change2()

{

    int *a = malloc(sizeof(int));

    if (a) {

        (*a) = 168;   

        return a;

    }

    return NULL;

}


我这样子用

    int *p = NULL;

    change(p);

    printf("%d\n", (*p)); // error, segment fault


    以下是正确的,

    int *p = NULL;

    p = change2();

   printf("%d\n", (*p));




为什么第一个函数无论怎样都会出错, segment fault, 错在哪里?

而第二个函数就是成功的? cgange2() 可以分配内存, 还可以改变它的值;


能否解释??

展开
收起
爱吃鱼的程序员 2020-06-03 13:54:29 633 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    int *p = NULL; 声明后的到一个值为0的指针变量,

    调用change(p)时,函数里的a是p的拷贝,值也为0,

    a = malloc(sizeof(int));之后,a的值变成一个申请的地址,而p的值还是0,

    函数返回时,指针变量a直接被释放,而p的值还是0,

    也就是说你的p从开始到结束一直就是个空指针,你可以用printf("%p\n", p);放在各处打印看看p的值。

    ######解释的相当到位。######第一个形参不能改变实参的值 第二个在堆上分配内存 两个函数完全不同######果然很有内憨呐######有什么内涵?哈。基础概念没搞清楚而已。你先搞清楚,一个函数调用时,参数究竟是在干什么。哈。######在函数change内部用malloc分配堆内存,调用函数change后如果忘记使用free释放,很容易发生内存泄露。参数可以传一个指针,指针指向的数据会随着函数change的操作而改变:
    /*
     * main.c
     * gcc main.c -o main
     * ./main
     */
    #include <stdio.h>
    #include <stdlib.h>
    void change(int *a) {
        a[0] = 168;
    }
    int main(int argc, char *argv[]) {
        int *p = malloc(sizeof(int));
        change(p);
        printf("%d\n", p[0]);
        free(p);
        return 0;
    }
    ######没啥内涵。。######

    这个其实就是值传递还是地址传递的区别,如果改成void  change(int *&a) ;你会发下就可以了

    ######

    引用来自“煦风之伤”的评论

    这个其实就是值传递还是地址传递的区别,如果改成void  change(int *&a) ;你会发下就可以了

    大神啊,啥时候C语言可以这样写了######不懂C,但是C++可以这样写######实参到形参是值拷贝,你看一下汇编代码就知道了######传参数的时候应该是change(&p),试试看。######你自己试了么?我试了不行...
    2020-06-03 16:41:38
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
当泛型遇上协议 立即下载
数据+算法定义新世界 立即下载
Go语言路上踩过的坑 立即下载