c - 将空值分配给指针的地址

标签 c pointers struct free pointer-to-pointer

如何取消初始化 free_x 函数中的 x?我必须这样做才能适应 API 方法。我可以很容易地取消初始化 x 只需将 null 分配给它,但我必须在 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?
}

最佳答案

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

解释:你没有​​分配内存(在堆或栈上或其他地方)所以没有什么可以释放的。您不拥有任何必须返回的资源的所有权,不设置任何需要清除的标志,或增加任何需要减少的信号量等。

您正在实现一个 API,但仅仅因为有一个函数原型(prototype)并不意味着您的实现必须执行任何操作(如果不需要)。只需更改注释以说明无事可做并将函数留空即可。

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 变量上胡闹,那将是你的问题!

关于c - 将空值分配给指针的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41161055/

相关文章:

c - valgrind/memcheck 无法释放 "large"内存块

C - 使用指向字符数组的指针打印网格

c - 如何修改链表中的插入函数以适合所需的输出?

c - 查找缓冲区地址以创建 shell 代码

c - 使用 bfs 的图中节点之间的距离

c - 从 C 程序将 sqlite3 表导出到文本文件

c - 为什么使用指向指针的指针时 scanf 可以正常工作?

c - C中的指针初始化和字符串操作

c++ - 固定 : Access Violation Reading Location (pointer to string array)

struct - 为什么生命周期强制转换适用于结构而不适用于特征?