最近在封装函数的时候遇见了这样的问题: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语言中的参数是按值传递的,而不是按引用传递的。要解决这个问题,可以通过传递一个指向指针的指针(即指针的地址)来修改调用者的指针。