将指针作为本地传递给函数

时间:2012-11-08 08:25:32

标签: c pointers

gcc 4.7.2 c89

您好,

我有以下功能:

void module_param_destroy(module_param_t *param)
{
    param = NULL;

    /* Stop the compiler from complaining */
    APR_UNUSED(param);
}

我这样称呼它:

module_param_destroy(module->call_param);

参数param是否设置为NULL。当我传递本地副本时,我不认为它在这里有用。

这样做会更好:

void module_param_destroy(module_t *md)
{
    md->param = NULL;

    /* Stop the compiler from complaining */
    APR_UNUSED(md->param);
}

并且这样称呼它:

module_param_destroy(md);

结构从malloc全局分配了内存。

非常感谢任何建议,

3 个答案:

答案 0 :(得分:5)

如果param指向从malloc获取的内存,则将其设置为NULL不足以正确清理。

使用module_param_destroy有两种常用方法:

void module_param_destroy(module_param_t *param)
{
    free(param);
}

void module_param_destroy(module_param_t **param)
{
    free(*param);
    *param = NULL;
}

主要区别在于,对于第二个变体,param被设置为可测试值以指示它已被清理。对于第一个变体,您必须记住,在函数返回后传递给module_param_destroy的指针不可用。

你分别称他们为

module_param_destroy(module->call_param);

module_param_destroy(&module->call_param);

答案 1 :(得分:2)

你的第二个module_param_destroy看起来不错,但是对于完整版,这是你的第一个函数的工作版本:

void module_param_destroy(module_param_t **pparam)
{
    *pparam = NULL;
}

编辑:是的,正如在另一个答案中所解释的那样,不释放任何内存,因此这是指向malloc内存的最后一个指针,在设置它之前你必须free它到NULL ...

答案 2 :(得分:2)

第一个版本不会更改指针,因为您要分配指针的本地副本,而是使用指向指针的指针来指定:

void module_param_destroy(module_param_t **param)
{
    *param = NULL;    
}

并称之为:

module_param_destroy(&module->call_param);