可以为传递指针NULL的函数

时间:2012-07-15 23:22:16

标签: c function pass-by-reference

目前我

void clistDeleteNode(clist_t *list,cnode_t **pnode) {
    cnode_t *node=*pnode;

    /* stuff done with node here, removed for clarity */

    free(*pnode);
    *pnode=0;
}

调用
clistDeleteNode(list,&aNode);

该函数在释放后自动为NULL的最终用户指针 - 我这样做,因为它使调试和泄漏检查更容易。

是否有一种更优雅的方式将指针传递给函数,例如可以修改而不必使用* & * aNode? (从最终用户的角度来看)

4 个答案:

答案 0 :(得分:3)

不,C中没有 pass-by-reference 这样的东西,将指针传递给你想要在另一个函数中更新的类型是唯一的,推荐的启用方式改变原始变量。


不推荐..真的,请不要使用它。

我见过开发人员(自上次以来很长时间)使用以下内容只是为了让事情“更容易”,但说实话我认为这会让人头疼而不是美丽。

#define REF(v) (&v)
#define REF_TO(type, v) type *v
#define DEREF(p) (*p)

void
func (REF_TO(int*, p))
{
  DEREF(p) = 0;
}

int
main (int argc, char* argv[])
{
  int *p;

  func (REF(p));

  return 0;
}

DO - NOT - USE - IT,SERIOUZLY。

答案 1 :(得分:3)

与C ++不同,如果没有在调用函数中使用aNode运算符,则无法传递&的地址。

使用预处理器来隐藏你实际在做的事情,很可能被认为是比上述方式更“优雅”的方式。

答案 2 :(得分:2)

没有

如果您想要一个函数来修改x,您需要将&x传递给该函数,无论其类型如何。

你可以将它隐藏在宏后面,但这可能最终会让人感到更加困惑。

答案 3 :(得分:0)

是的,但它很难看;您可以使用数组类型和数组指针衰减来模拟参考参数。

typedef void (*void_ptr_ref)[1];
void func(void_ptr_ref p) {
    p[0] = 0;
}
int main() {
    void_ptr_ref p;
    func(p);
    /* do stuff with p */
}

Posix实际上对jmp_buf类型使用了这个(可怕的!)样式(在setjmp.h中使用)。

如果你的“指针”类型打算用作opaque类型,这是非常值得的;你当然不希望用户必须双重间接void_ptr_ref p或必须投射它等。