2015-10-20 3 views
0

Пожалуйста, дайте мне знать, что я сделал неправильно.Как использовать двойной указатель пустоты

У меня есть две структуры

struct a{ 
    few elements; 
    void **ptr; 
}; 

struct b { 
    few elements; 
}; 

I tried to allocate memory for these two structures like 
func2(struct a *aptr) 
{ 
    struct b *bptr = kmalloc(sizeof(struct b), GFP_KERNEL); 
    aptr->ptr = (void *)&bptr; 
    // here *(aptr->ptr) is pointing correctly to bptr. 
} 
func1() 
{ 
    struct a *aptr = kmalloc(sizeof(struct a), GFP_KERNEL); 
    func2(aptr); 
    /*though aptr->ptr is pointing correctly, *(aptr->ptr) is no more pointing to bptr*/ 
} 

Я пытаюсь таким образом, чтобы я мог эффективно использовать container_of. Пожалуйста, исправьте меня, если моя реализация неверна.

Наблюдение: Если я объявляю struct b *bptr вне области действия, *(aptr->ptr) правильно указывает на bptr.

+0

func1() - основная функция вызова. func1() и func2() могут быть в разных файлах. – Narain

+1

Почему у вас есть 'void **', а не 'void *'? – ypnos

+0

Если я использую void *, я не могу использовать container_of для сохранения адреса aptr. – Narain

ответ

2

Здесь

aptr->ptr = (void *)&bptr; 

вы назначаете адрес локальной переменной, которая выходит из области видимости, когда функция возвращает. Возможно, вы хотели назначить bptr вместо &bptr?

+0

У меня этот момент. Я хочу назначить & bptr. – Narain

+1

@narain почти наверняка вы не хотите назначать & bptr в любом месте. Вам все равно, где хранится указатель! вам небезразличен указатель на выделенный вами блок памяти. Просто назначьте 'aptr-> ptr = kmalloc (...)' –

+0

Я не знаю, сколько выделить. struct b может быть в другом файле. – Narain

1

Принимая адрес локальной автоматической переменной и сохраняя ее, неправильно. Вы помните о каком-то адресе в стеке!

func2(struct a *aptr) 
{ 
    struct b *bptr = kmalloc(sizeof(struct b), GFP_KERNEL); 
    aptr->ptr = (void *)&bptr; 
    // here *(aptr->ptr) is pointing to bptr, which is only on the stack 
    // until you exit the block, then it ceases to exist and you're pointing 
    // to some unknown/invalid data. 
} 
+0

Да, я понял. но как его решить. Я не хочу, чтобы он (struct b * bptr) объявлял глобальным. – Narain

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