2014-02-07 4 views
2

В заголовочном файле:Невозможно получить доступ к данным STRUCT

typedef struct { 
char* a;   
int allowed; 

struct suit { 
     struct t { 
       char* option; 
       int count;  
     } t; 

     struct inner { 
       char* option; 
       int count;  
     } inner;   
} suit; 
} contain; 

typedef struct { 
     contain info; 
} query_arg_t; 

В модуле ядра,

// инициализировать

static const contain _vector = { 
.a = "John", 
.allowed = 1, 
.suit = { 
    .t = { 
     .option = "ON", 
     .count = 7 
    }, 
    .inner = { 
     .option = "OFF (*)", 
     .count = 7 
    }   
} 
}; 

Однако, как мы пытаемся:

query_arg_t q; 

    q.info = kmalloc(sizeof(_vector), GFP_KERNEL); 

Мы получим эту ошибку: ошибка: несовместимые типы при присвоении типа «содержать» от типа «void» *

Вышеприведенная ошибка решается @SunEric и @Sakthi Kumar.

  q.info = kmalloc(sizeof(_vector), GFP_KERNEL); 
     memcpy(&(q.info), &(_vector), sizeof(_vector)); 

Кажется, сейчас. Он строит, но когда он работает с этой частью, он утверждает, что стек ядра поврежден. после попытки выполнить:

 printf("option: %s \n", q.info->suit.t.option); 
    printf("option: %s \n", q.info->suit.t.option); 

[Обновлено: Решено]

@Sakthi Кумар решил ее:

//removing kmalloc 
    // commenting out: q.info = &_vector; 
    memcpy(&(q.info), &(_vector), sizeof(_vector)); 

printf("option: %s \n", q.info.suit.t.option); 
printf("option: %s \n", q.info.suit.inner.option); 

ответ

1

вашу структуру, чтобы быть в форме

typedef struct { 
     contain *info; 
} query_arg_t; 

Вы пытаетесь присвоить указатель (kmalloc возвращает void *) к переменной struct (contain).

+0

Спасибо, @Sakthi Kumar. Не могли бы вы также привести меня к следующему вопросу, указанному выше? – Babbit

+1

@Babbit, поскольку 'info' является указателем, к которому вы должны получить доступ, например' printf ("option:% s \ n", q.info-> suit.t.option); ' –

+0

Он строит, но когда он работает с этим part, он задает некоторую проблему стека ядра. – Babbit

0

Спецификация языка C запрещает объявляющих типов структуры внутри других структур без объявления член этого типа.

+0

Можете ли вы показать мне, как исправить это? Он провалился только на км. – Babbit

2

void * kmalloc (size_t size, int flags);

kmalloc возвращает тип void * который вы пытаетесь присвоить contain в-правильно.

Изменение к,

typedef struct { 
    contain *info; // info is a pointer to struct contain 
} query_arg_t; 

query_arg_t q; 
q.info = kmalloc(sizeof(_vector), GFP_KERNEL); 

Ответ на вопрос: Followup

q.info является указателем на структуру, указывая на contain. Вам нужен оператор массива -> для доступа к элементам структуры через указатель. Так что попробуйте ниже вариантов доступа info как,

q.info->stat.t.option 

Или

(*q.info).stat.t.option 
+0

Спасибо, @SunEric. Не могли бы вы также привести меня к следующему вопросу, указанному выше? – Babbit

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