2016-05-13 3 views
0

Предполагая, что у меня есть следующий код:хранения объекта структуры на пустой указатель

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 таким образом:

return (struct ops *)inst->priv 

ответ

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; 
} 

это не безопасно, потому что те структуры, где создаются в стеке внутри функции и, следовательно, их адреса памяти будет отмечаться как свободное право при выходе из функции.

Способ обойти это использовать кучу (таНос) или (возможно, более простой способ) объявить структуры, как это:

static struct inst p1; 
static struct ops ops; 

Таким образом, вам не нужно беспокоиться о выделении памяти и вы уверены, что эти элементы стека никогда не будут стерты до конца программы, и поэтому вы можете использовать их указатели по своему усмотрению.

+0

благодарит за отзыв. Я знаю проблемы с возвратом объектов, связанных с стекем, и мой вопрос скорее касался typecasting в 'return (struct ops *) inst-> priv' - это требуется или может быть опущено? – Mark

+0

Вы можете опустить его. –

+0

Но не возвращайте указатели стека. Он не будет делать то, что вы намереваетесь сделать. –