C语言中的地址传递(传指针,传递给形参的指针仍然是实参指针的一份

2019-08-12  本文已影响0人  记事本的记事本

先看一个例子:这个程序为什么会崩溃?

#include <stdio.h>
#include <stdlib.h>

int f(int *q)
{
    int a = 10;
    q = (int*)malloc(sizeof(int));
    *q = a;
    return 0;
}

int main()
{
    
    int *p = NULL;
    f(p);
    printf("%d", *p);
    return 0;
}

此处的q任然是p的一个拷贝,可以通过这个程序证明:

#include <iostream>


int f(int *q)
{
    std::cout << &q << std::endl;
    return 0;
}

int main()
{
    int a = 10;
    int *p = &a;
    f(p);
    std::cout <<  &p;
    return 0;
}
输出为: image.png

明指针p与指针q的地址是不同的,证明q是p的一个拷贝。

所以第一个程序崩溃的原因:函数中的q其实是实参p的一份拷贝,函数中的操作都是对q进行的,p仍然是NULL,所以输出*p的值产生崩溃!

可以把形参改为二级指针,程序便可以按预想中的情形进行:

#include <stdio.h>
#include <stdlib.h>

int f(int **q)
{
    int a = 10;
    *q = (int*)malloc(sizeof(int));
    **q = a;
    return 0;
}

int main()
{

    int *p = NULL;
    f(&p);
    printf("%d", *p);
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读