2014-10-30 3 views
1

Если у меня есть:container_of макросъемки, когда у нас есть указатель внутри структуры

struct my_container { 
    int x; 
    struct some_struct *ss; 
} 

Если у меня есть указатель сс, через которую я могу получить доступ к членам внутри some_struct, я должен быть в состоянии получить доступ my_container, выполнив правильно? Это то, что я делаю:

struct my_container *my_c; 
my_c = container_of(&ss, struct my_container, ss) 

Но это не работает точно, и я не в состоянии понять, почему. Может кто-нибудь мне помочь? Есть что-то, чего я не хватает?

+0

Что вы подразумеваете под container_of() - это используемая определенная функция? –

+1

@Madan - это макрос в ядре linux, который действует как «обратный» из 'offsetof' –

+0

Является ли container_of чем-то вроде #define container_of (ptr, type, member) ((type *) ((char *) (ptr) - (unsigned long) (& ((тип *) 0) -> участник)))? – midor

ответ

1

Если у вас есть только указатель на some_struct (то есть, если вы только есть struct some_struct *ss;), вы не можете использовать container_of макрос таким образом, как и &ss просто оценить по адресу некоторой переменной, не по адресу от my_container. Чтобы использовать его правильно, вам понадобится указатель на указатель на some_struct (т. Е. struct some_struct **pss).

+0

Хорошо. Я понимаю, что я делаю неправильно. Спасибо! Но проблема, которую я имею сейчас, заключается в том, что для получения указателя на some_struct я использую макрос container_of(). Я не уверен, как мне получить указатель на указатель на some_struct. Есть ли способ сделать это? –

+0

Это означает, что вместо использования struct my_container * my_c; my_c = container_of (& ss, struct my_container, ss); вы должны использовать: struct some_struct ** my_struct_ptr = & some_struct_ptr; my_c = container_of (& my_struct_ptr, struct my_container, ss); . Первым параметром container_of является адрес для начала, а не указатель внутри вашей структуры. Надеюсь, это поможет – buzz

+1

@buzz Я думаю, что вы имели в виду struct some_struct ** my_struct_ptr = & some_struct_ptr; my_c = container_of (my_struct_ptr, struct my_container, ss); – 4pie0

Смежные вопросы