关于 C语言函数封装,传递参问题

最近在封装函数的时候遇见了这样的问题:C语言传参问题

这个可能需要,认真看一下代码,这个是c语言基础问题,适用于基础较差的朋友看。

下面是案例代码(错误版本


struct test_dev* test_alloc(struct test_dev *p_priv)
{

    p_priv= kzalloc(sizeof(struct test_dev ), GFP_KERNEL);
    if (!p_priv) 
        goto err_probe1;
    return p_priv;

err_probe1:
    *p_priv = NULL;
    debug(" ERR alloc ");
    return NULL;
}

int test1()
{
    test_dev *p_test1;
    if(test_alloc(p_test1) == NULL)
        return -1;
    return 0;
}

        如上所示,我在主函数中定义了一个结构体指针,但是并没有开辟空间,本意是想调用函数test_alloc来批量开辟空间,但是在这里我代码运行的过程中并没有按照我预想的方向走,返回的指针不为空 IF判定都能过,赋值以及使用的时候就出现了段错误。但是我去函数中测试发现空间是开辟成功了的。

再看下面代码(修改版本):


struct test_dev* test_alloc(struct test_dev **p_priv)
{
    struct test_dev *priv;
    priv= kzalloc(sizeof(struct test_dev ), GFP_KERNEL);
    if (!p_priv) 
        goto err_probe1;
    *p_priv = priv;
    return priv;

err_probe1:
    *p_priv = NULL;
    debug(" ERR alloc ");
    return NULL;
}

int test1()
{
    test_dev *p_test1;
    if(test_alloc(&p_test1) == NULL)
        return -1;
    return 0;
}

将代码修改为这样就是我想要的结果了,为什么会这样呢?

        在第一个案例中代码有一个主要的问题在于priv指针在函数内部被重新分配,而不会影响到调用该函数时传入的指针。

        换句话说,传入的指针不会保存你在函数中分配的内存地址。这是因为C语言中的参数是按值传递的,而不是按引用传递的。要解决这个问题,可以通过传递一个指向指针的指针(即指针的地址)来修改调用者的指针。

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

orange....

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值