2017-05-08 56 views
-1

我徘徊在最後6個小時試圖解決這個該死的問題。首先,我是一個c編程的完全新手,所以請不要期望太高。 我需要編寫一個程序,在結構中創建一個整數數組。所以我寫了一個頭文件,並且除main之外還創建了另一個名爲「intarray.c」的源文件,因爲我必須這樣做。我包括了一切等等,現在我需要一個函數,它得到一個參數「int n」,用於在結構中創建int數組a [n]。但我無法得到這個工作..對不起,我的壞解釋,但我不知道我在這裏幹什麼。我也嘗試過使用指針,但是這讓我困惑,我不確定它們是否有必要。C - 在源文件中創建一個結構

我的頭看起來像這樣:

#ifndef INTARRAY_H_INCLUDED 
#define INTARRAY_H_INCLUDED 

struct IntArray 
{ 
    int length; 
    int numbers[]; 
}; 
void create(int); 
void destruct(); 
void read(int); 
void write(int, int); 

#endif // INTARRAY_H_INCLUDED 

和我的功能看起來像這樣:

create(int n) 
{ 
    struct IntArray arr; 
    arr.length = n; 
    arr.numbers[n]; 
} 

但現在我不能在其他功能,例如使用結構如果我想在數組中寫入特定的位置。我該如何解決這個問題? 和啞巴問題。

+3

這段代碼甚至沒有編譯。閱讀關於靈活數組成員和動態內存分配你的函數原型也是錯誤的。總之:alomost中的錯誤太多,沒有代碼顯示。重溫你的課程材料或者獲得一本好的C書,並向你的導師諮詢意見。 – Olaf

+1

'struct IntArray * create(int n){struct IntArray * arr = calloc(1,sizeof(* arr)+ n * sizeof(int)); if(arr){arr.length = n; } return arr; }' – BLUEPIXY

+0

如果一個結構體有一個靈活的數組成員,它必須使用'malloc()'來分配,這樣你就可以添加你想要的數組的大小。 – Barmar

回答

0

你需要動態分配內存:

struct IntArray 
{ 
    int length; 
    int * numbers; 
}; 

struct IntArray * create(int len) { 
    struct IntArray * ret = malloc(sizeof(struct IntArray)); 
    ret->length = len; 
    ret->numbers = malloc(len * sizeof(int)); 
    return ret; 
} 
0

當你和一個靈活數組成員(FAM)工作,你需要明確的分配結構內存和數組作爲單個分配,如BLUEPIXYcomment中所示。

您還需要編寫編譯代碼:

struct IntArray *create(int n) 
{ 
    struct IntArray *result = malloc(sizeof(*result) + n * sizeof(result->numbers[0])); 
    if (result != NULL) 
     result->length = n; 
    return result; 
} 

如果你是一個64位系統上,基本結構的大小大概是8個字節,而不是你通常會期望在4,因爲指針需要在8字節的邊界上對齊,所以編譯器會添加4個字節的填充。在32位系統上,大小將爲4,因爲靈活數組成員的大小不包含在結構的大小中。

相關問題