将null指定给指针的地址

时间:2016-12-15 09:48:56

标签: c pointers struct free pointer-to-pointer

如何在free_x函数中取消初始化x?我必须这样做才能适应API方法。我可以很容易地通过为它分配null来取消初始化x,但我必须在free_x函数中进行。

typedef struct
{
    int field1;
    void *field2;
}my_struct;

static my_struct var;

int main(void)
{
    void *x;

    alloc_x(&x);
    free_x(x); // x = NULL works but not allowed

    return 0;
}

void alloc_x(void **param)
{
    *param = (my_struct *)&var;
}

void free_x(void *param)
{
    // how can I free param here?
}

4 个答案:

答案 0 :(得分:2)

简单回答:您的代码已经完成,所以不要再做了。

说明:您没有分配内存(在堆或堆栈或其他地方),因此没有任何内容可以释放。您不会获取必须返回的任何资源的所有权,设置需要清除的任何标志,或者增加任何需要递减的信号量等。

您正在实现一个API,但仅仅因为有一个函数原型并不意味着您的实现必须做任何事情,如果它不需要。只需更改注释即可解释无所事事,并将该函数留空。

void alloc_x(void **param)
{
    *param = &var; // No need to cast here, just assign.
}

void free_x(void *param)
{
    // Nothing allocated, taken, incremented, etc. in alloc_x, so ...
    // nothing to free, release, decrement, etc. here in free_x.
}

使用API​​的代码期望在调用之后释放paramx指针后面的内存,因此无论如何它都不应该对其变量执行任何操作。如果他们这样做,那不是你的问题,但是如果你和调用者的x变量一起讨论,那将是你的问题!

答案 1 :(得分:0)

只需撰写*param = NULL;

  

malloc返回void *并且free取无效*,因此你的一些强制转换是   毫无意义,即使你是,你也总是在释放空虚*   从另一种指针开始。

答案 2 :(得分:0)

在不更改alloc_x功能的情况下,我认为不可能。一种可能的实现如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
    int field1;
    void *field2;
}my_struct;

static my_struct var;

void alloc_x(void **param)
{
    *param = malloc(sizeof(my_struct *));
    memcpy(*param,(my_struct *)&var,sizeof(my_struct *));
}

void free_x(void *param)
{
    free(param);
    // how can I free param here?
}
int main(void)
{
    void *x;

    alloc_x(&x);
    free_x(x); // x = NULL works but not allowed

    return 0;
}

答案 3 :(得分:0)

有点奇怪,但你可以做到

#include <stdio.h>
#include <string.h>

typedef struct
{
    int field1;
    void *field2;
}my_struct;

static my_struct var;

void alloc_x(void **param)
{
    *param = (my_struct *)&var;
}

void free_x(void *param)
{
    memset(param, 0x00, sizeof(void *));
}

int main(void)
{
    void *x;

    alloc_x(&x);
    printf("Before: x=%p\n", x);
    free_x(&x);
    printf("After: x=%p\n", x);

    return 0;
}

void free_x(void *param)
{
    my_struct **p = param;

    *p = NULL;
}

显然它仅在使用void *

中有效