将NULL设置为struct指针,但在选中时永远不会为NULL

时间:2014-03-18 07:33:06

标签: c kernel point

在名为

的函数中给出
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只是一个结构。

3 个答案:

答案 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

  • some_ptr指向some_struct。
  • 函数参数arg_t* q在堆栈上分配。
  • some_ptr的内容已复制到q。
  • some_ptr和q现在都指向some_struct。
  • 然后将q设置为NULL。
  • 然后功能结束。 q不再存在。
  • 由于你没有更改some_ptr,它仍然指向some_struct。

现在,如果你没有设置some_ptr指向任何东西,它将包含任何垃圾值。在进行程序的调试构建时,默认情况下变量可能设置为NULL,但绝对不能保证!

因此,如果some_ptr未初始化并且在调用函数时碰巧包含值NULL,则可能看起来好像您已成功将其设置为NULL。但实际上,你很幸运,你的未初始化变量包含了这个值。


要将main中的变量实际设置为NULL,您必须执行

arg_t callFunct1 (void) {
  return NULL;
};

arg_t* some_ptr;
some_ptr = callFunct1 ();