通过引用传递但参数的值为null

时间:2016-09-19 10:09:52

标签: c function struct parameter-passing pass-by-reference

我在C编程。

我有一个结构:

 struct MY_TYPE {
      boolean flag;
      short int value;
      double stuff;
    };

我有一个函数,它将指向MY_TYPE的指针作为参数:

getData(struct MY_TYPE ** m_type) {
  // I initialise an object of MY_TYPE
  struct MY_TYPE a = {.value = 123};
  // I assign the address of above object to a pointer of MY_TYPE
  struct MY_TYPE *p = &a;
  // I assign the address of above pointer to parameter
  m_type = &p;
}

在我的主程序中,我调用了上面的函数:

struct MY_TYPE *my_param;
getData(&my_param);

// I set a break pointer here, and it shows me my_param is NULL, why?

在调用getData(...)之后,传入的参数为NULL,为什么?

2 个答案:

答案 0 :(得分:2)

这是一种未定义的行为,由于您正在分配通过值传递的指针,因此不会发生这种行为。

  • 调用者会忽略您对m_typegetData所做的任何更改。您需要指定*m_type才能使更改产生任何差异。
  • 如果发生这种变化,您将开始获得未定义的行为,因为struct a一旦getData返回就会超出范围。

您可以通过返回在函数内初始化的动态分配块来解决此问题:

getData(struct MY_TYPE ** m_type) {
  // I initialize an object of MY_TYPE
  struct MY_TYPE a = {.value = 123};
  // I make a copy into dynamic memory
  struct MY_TYPE *copy = malloc(sizeof(struct MY_TYPE));
  memcpy(copy, &a);
  // I assign the address of above pointer to parameter
  *m_type = copy;
}

来电者需要释放通话中收到的内存:

struct MY_TYPE *my_param;
getData(&my_param);
... // Use my_param here.
// Now that I am done with my_param...
free(my_param);

答案 1 :(得分:1)

您正在使用局部变量,此变量的生命周期以函数结束,使用malloc以保留其值。

struct MY_TYPE *p = malloc(sizeof *p);

if (p != NULL) {
    p->value = 123;
    *m_type = p; /* Dereference the passed pointer to pointer */
}