2013-04-05 4 views
0

этого структура, что я объявил: -Что не так в этом распределении?

struct page_table_entry { 
    struct addrspace* as; 
    vaddr_t va; 
    //page_state_t state; 
    int timestamp; 
}; 

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

struct page_table_entry **coremap = (struct page_table_entry**) 
kmalloc(npages*sizeof(struct page_table_entry*)); 
int i; 
for(i=0;i<npages;i++) 
{ 
    coremap[i] = (struct page_table_entry*)kmalloc(sizeof(struct page_table_entry)); 
    coremap[i].va=(firstAddress+(i*PAGE_SIZE)); 
} 

Его дает мне ошибку на последнюю строку, где я экранная переменную в. Ошибка: -

error: request for member `va' in something not a structure or union 
+1

'coremap [я] -> ва' – maditya

+0

О !!? Ты прав. Подчеркивал слишком много о распределении, что я не обращал на это особого внимания. – fatrock92

ответ

3

У вас есть массив указателей на структуры, а не массив структур.

В строке coremap [i] = (struct page_table_entry *) kmalloc (sizeof (struct page_table_entry)); вы выделяете выделение памяти page_table_entry*, поэтому coremap [i] - это указатель.

Вы получаете доступ к фактической-структуру с помощью

coremap[i]->va=(firstAddress+(i*PAGE_SIZE)); 
0

Помимо очевидных изменений в coremap[i]->va, вы могли бы изменить в массив структур:

struct page_table_entry *coremap = (struct page_table_entry*)kmalloc(npages*sizeof(struct page_table_entry)); 
int i; 
for(i=0;i<npages;i++) 
{ 
    coremap[i].va=(firstAddress+(i*PAGE_SIZE)); 
} 
1

coremap является указателем на указатель на struct page_table_entry.

Когда вы разыгрываете его с помощью coremap[i], вы получаете указатель на struct page_table_entry.

Вы не можете использовать . по указателю на структуру. Вы должны использовать ->:

coremap[i]->va=(firstAddress+(i*PAGE_SIZE)); 

или

(*coremap[i]).va=(firstAddress+(i*PAGE_SIZE)); 
Смежные вопросы