2012-04-16 132 views
0

我有一個數組'y'與x號。 (數字'x'由用戶給出),我需要創建一個結構數組,其元素的類型與數組'y'中的元素完全相同,即結構數組將具有'x'元素。動態名稱結構變量C

+1

不錯。你有什麼問題? – AusCBloke 2012-04-16 12:40:26

+0

如果你有一個數組,你必須有一個長度來安全地使用它。爲什麼不能分配一組相同長度的結構? – 2012-04-16 12:48:12

回答

0

如果我理解你是正確的,你有一個類型的「數組」,元素的數量由用戶決定。我猜你給它分配使用malloc這樣的:

type_of_y *y = malloc(x * sizeof(type_of_y)); 

現在要創建一個從結構類似的「陣列」,與相同數量的元素。爲什麼你不能像y那樣做呢? I.e:

struct my_structure *new_array = malloc(x * sizeof(struct my_structure)); 
0

您可能需要一個像這樣的結構。陣列的類型顯示爲ArrayType;你可以寫intdouble或其他任何適合你的東西。

typedef struct array 
{ 
    size_t  num_elements; // stores the 'x' value 
    ArrayType *arr_elements; 
} array; 

然後可以分配該類型的數組:

array *list = calloc(sizeof(array), number); 
for (int i = 0; i < number; i++) 
{ 
    list[i].arr_elements = malloc(sizeof(*list[i].arr_elements) * array_size); 
    list[i].num_elements = array_size; 
} 

您應該錯誤檢查內存分配:

if (list == 0) 
    ...error... 

    if (list[i].arr_elements == 0) 
    { 
     ...release already allocated space... 
     ...error... 
    } 

注意,在陣列的list(可能每個陣列不是名稱的最佳選擇)可以有不同數量的元素; num_elements告訴你特定數組有多大。

請注意,C99 靈活陣列成員在這裏並不是真的有幫助。你不能擁有一個包含靈活數組成員的結構數組,儘管你可以有一個指向數組的指針。

+0

當你設置結構的兩個部分後,使用'calloc()'沒有優化:) – Eregrith 2012-04-16 13:20:29

0
/* new array */ 
MYSTRUCT *abc = (MYSTRUCT *)calloc(x, sizeof(MYSTRUCT)); 
/* copy contents of 'y' into new array */ 
for (int i = 0; i < x; i++) 
    abc[i] = y[i];