Учитывая указатель на член в структуре, как вернуть указатель на эту структуру? - PullRequest
2 голосов
/ 26 мая 2011

Это вопрос интервью.Понятия не имею, как это решить.Кто-нибудь может мне помочь:?

Учитывая указатель на член a в структуре, напишите подпрограмму, которая возвращает указатель на структуру.

Спасибо!

Ответы [ 3 ]

8 голосов
/ 26 мая 2011

Во-первых, для этого вам нужно знать тип включающей структуры StructType и имя члена member. Это должно быть дано. Без этого проблема не имеет решения.

Во-вторых, я не знаю, почему другие ответы настаивают на том, чтобы заново изобретать колесо (и, кроме того, совершать неопределенные и непереносимые хаки) вместо использования стандартного макроса offsetof. С offsetof ответом является

StructType *pstruct = 
  (StructType *) ((char *) pmember - offsetof(StructType, member));
5 голосов
/ 26 мая 2011

Код ядра Linux (по лицензии GPLv2) включает удобный макрос container_of():

#define container_of(ptr, type, member) ({                      \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})

Используется так:

static inline struct ext3_inode_info *EXT3_I(struct inode *inode)
{
    return container_of(inode, struct ext3_inode_info, vfs_inode);
}

@ Ответ Ричарда превосходен; Основное отличие состоит в том, что этот код параметризован для принятия любого struct и любого члена, и в результате, соответственно, более сложный.

4 голосов
/ 26 мая 2011

Учитывая структуру с именем s и элемент с именем m

struct s * BaseS(byte *p)
{
     return (struct s *) (p - ((byte*) &(((struct s *)0)->m)));
}

Идея состоит в том, чтобы получить смещение элемента и вычесть его из указателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...