2013-02-05 105 views
1

我正在修改Android OS的一部分的項目,並且當我嘗試實現新系統調用以返回所有進程的狀態時,遇到以下問題錯誤:C:數組類型中的錯誤具有不完整的元素類型

kernel/sys.c: error: array tpye has incomplete element type. 

我在sys.c所做的是以下幾點:

/***previous code in sys.c***/ 

SYSCALL_DEFINE2(new_syscall, struct info __user*, buf, int __user*, nr){ 
if(!buf || !nr) return -EINVAL; 

int nr_copy; 
int success; 

success = copy_from_user(&nr_copy, nr, sizeof(int)); 
if(success == 0) return -EINVAL; 
if(nr_copy < 1) return -EINVAL; 

struct info buf_copy[nr_copy]; /************* 

return 0; 
} 

編者抱怨標有星線。

我info.h文件看起來像這樣:

#ifndef __LINUX_INFO_H 
    #define __LINUX_INFO_H 

    struct info { 
     long state;   
    pid_t pid;   
    pid_t parent_pid;  
    }; 

    #endif 

我試過,包括sys.c的info.h,但它並沒有幫助的。任何人都可以向我提供一些我應該看到的方向嗎?

謝謝

+0

的可能的複製[陣列型有編譯時不完整的元素類型的錯誤(http://stackoverflow.com/questions/10386539/array-type-has-incomplete-element -type-error-when-compiling) – Kusalananda

回答

2

你使用什麼編譯器?動態大小的數組是一種新的C功能,可能不受支持。 OTOH,它們被分配在堆棧上,這是一個很稀缺的商品in-kernel。您應該通過kmalloc或其中之一來爲陣列分配內存。

+0

它不是動態分配的數組,它是一個長度爲nr_copy的固定大小的數組。 kmalloc – turtlesoup

+1

@ user1926344的好處是,你得到的數組的大小超出了它的定義範圍,除非我的kernel-C現在已經關閉了...... – vonbrand

+1

nr_copy是一個聲明爲int的變量,所以buf_copy [nr_copy]是在編譯時不是一個固定大小的數組。 –

0

你有沒有嘗試明確聲明狀態爲長整型。

long state; 

long int state; 
+0

有兩個__user *指針。 info __user *和int __user * – rjt

+0

'long state'和'long int state'在C中意味着完全一樣的東西。 – vonbrand

+0

@vonbrand,檢查代碼的假設。取決於硬件和操作系統:286上的sizeof(int)在386上的16位OS上返回2 sizeof(int)返回2,而在32位操作系統上返回4。我的x86_64上的sizeof(int)返回4,但sizeof(long int)返回8. – rjt

相關問題