在名为
的函数中给出void callFunct1 (arg_t *q) {
q = NULL;
};
EXPORT_SYMBOL(callFunct1);
返回null。
为什么在另一个函数中,q永远不会为NULL?我该如何纠正?
arg_t qH;
arg_t* q;
//
callFunct1 (&qH);
q = &qH;
if (q == NULL) {
.....
}
arg_t只是一个结构。
答案 0 :(得分:3)
指针与C中的任何其他非数组变量没有什么不同。当作为参数传递时,如果要修改某些内容,则必须通过地址传递。声明参数是一个正式的指向该类型的指针,并使用解引用运算符*
从调用者传递实体的地址,以访问调用者的值。
就像这样:
void foo(int *p)
{
*p = 5;
}
像这样调用:
int x;
foo(&x); // x will be 5 on return
所以它也适用于指针类型。如果要按地址修改指针,则地址正是所需的。将参数声明为指向指针的指针 - arg_t
并取消引用它以将引用的指针设置为NULL:
void foo(arg_t** pp)
{
*pp = NULL;
}
和
arg_t *p;
foo(&p); // p will be NULL on return
答案 1 :(得分:0)
void callFunct1 (arg_t *q)
返回任何内容,因为它的返回类型被声明为void
。
它的参数q
是在调用callFunc1
时作为参数传递的值的副本,并且此副本存在于callFunc1
的堆栈中只要callFunc1
运行。
所以这一行
q = NULL;
将NULL
分配给仅在q
本地存在的callFunc1
。
答案 2 :(得分:0)
该函数不返回任何内容。您将指针传递给结构。该指针是传递指针的副本,它与main中的变量不同。
这是行间的事情:如果我们有一个像下面的代码那样的调用者
int main()
{
arg_t some_struct;
arg_t* some_ptr = &some_struct;
callFunct1 (some_ptr)
}
然后调用callFunct1
arg_t* q
在堆栈上分配。现在,如果你没有设置some_ptr指向任何东西,它将包含任何垃圾值。在进行程序的调试构建时,默认情况下变量可能设置为NULL,但绝对不能保证!
因此,如果some_ptr未初始化并且在调用函数时碰巧包含值NULL,则可能看起来好像您已成功将其设置为NULL。但实际上,你很幸运,你的未初始化变量包含了这个值。
要将main中的变量实际设置为NULL,您必须执行
arg_t callFunct1 (void) {
return NULL;
};
arg_t* some_ptr;
some_ptr = callFunct1 ();