假设我有以下代码:
-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
答案 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;
这样您就不必担心内存分配,并且您确定这些堆栈元素在程序结束之前永远不会被删除,因此您可以根据需要使用它们的指针。