在void指针处存储结构对象

时间:2016-05-13 20:35:41

标签: c function pointers

假设我有以下代码:

-dontwarn com.fasterxml.jackson.databind.**

因此我可以这样做:

struct inst {
    uint32_t field1;
    uint16_t field2;
   void *priv;
};

struct ops {
    int (*init)(void);
    int (*deinit)(void);
    int (*run)(void);
};

以后以struct inst p1; struct ops ops; /* init p1 and ops.*/ ... inst->priv = ops; 方式访问数据是否安全:

priv

1 个答案:

答案 0 :(得分:0)

inst->priv = ops;

不应该

inst->priv = &ops;

此外,为了解决您的问题,"以后以这种方式访问​​数据是否安全:",不,它不是。这取决于您创建结构实例的位置。如果您正在创建这样的

struct ops * dummyA()
{
    struct inst p1;
    struct ops ops;
    //(...)
    inst->priv = (void*)&ops;
    //(...)
    return (struct ops *)inst->priv;
}

它是不安全的,因为那些在函数内部的堆栈中创建的结构,因此,当你离开函数时,它们的内存地址将被标记为空闲。

解决这个问题的一种方法是使用堆(malloc)或(可能更简单的方法)声明这样的结构:

static struct inst p1;
static struct ops ops;

这样您就不必担心内存分配,并且您确定这些堆栈元素在程序结束之前永远不会被删除,因此您可以根据需要使用它们的指针。