2014-02-07 75 views
2

在頭文件:無法訪問結構數據

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 *'分配類型'contains'時的不兼容類型

上述錯誤由@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

它會生成,但是當它運行到部分,它指出了一些內核堆棧問題。 – Babbit

0

C語言規範禁止其他結構內聲明結構類型而不宣告該類型的成員。

+0

你能告訴我如何補救嗎? 它只在kmalloc失敗。 – 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); 

答到後續問題:

q.info是一個指向結構指向contain。您需要數組運算符->通過指針訪問結構成員。因此,嘗試下面的選項訪問info爲,

q.info->stat.t.option 

或者

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

謝謝@SunEric。你能不能就以上修正的問題引導我? – Babbit