2013-10-29 173 views
0

我想創建一個結構播放器的動態數組。我知道結構的大小,所以我不想爲每個結構分配內存。所以我定義C.動態結構陣列

struct player 
{ 
    uint32_t efficiency ; 
    uint32_t number; 
} ; 

struct array 
{ 
    size_t size; 
    struct player data[]; 
}; 

但之後,我創建和填充陣列,並嘗試讀取數據,我得到一個錯誤

static inline size_t sizeof_array(size_t size) 
{ 
    return sizeof(struct array) + (size * sizeof(struct player)); 
} 

struct array *create_array(size_t size) 
{ 
    struct array *ret = calloc(1, sizeof_array(size)); 
    if (! ret) 
     abort(); 
    ret->size = size; 
    return ret; 
} 

void free_array(struct array *array) 
{ 
    free(array); 
} 

int main() 
{ 
    size_t size; 
    scanf("%d",&size); 
    struct array *players = create_array(size); 

    for(size_t i = 0; i < size; ++i){ 
     players -> data[i].efficiency = i; //some data 
     players -> data[i].number = i;  //some data 
    } 

    for(size_t i = 0; i < size; ++i){ 
     printf("%d) %d\n", players -> data[i].number,players -> data[i].efficiency); 
    } 

    free_array(players); 
    return 0; 
} 

錯誤: 此應用程序已請求運行時終止它在不尋常的方式 有關更多信息,請聯繫應用程序的支持團隊。

我該如何分配內存?

UPDATE 頭:stdio.h中,stdint.h,inttypes.h,stdlib.h中

GCC(轉2,由MinGW的,建立項目生成)4.8.0 版權所有(C)2013免費Software Foundation,Inc. 這是免費軟件;請參閱複製條件的來源。有沒有 保修;甚至不適用於適銷性或針對特定用途的適用性。

+1

你能發佈的錯誤? –

+0

適合我,當我編譯它與海灣合作委員會4.8.1,也許有一些其他的代碼,你沒有顯示?頭文件#include stdio.h inttypes.h malloc.h? –

+1

'scanf(「%d」,&size);'。不知道是不是這個問題,但是你應該使用''%d''作爲'size_t'數據類型。參見http://www.viva64.com/en/k/0023 /。 –

回答

-1

什麼是錯誤?

在你的結構定義錯誤是struct player data[];應該struct player* data;或寫data[100]

+0

-1編輯:我刪除了反對票,因爲你是新來的SO,並且可能不會發表評論 – tay10r

+0

但是錯誤沒有給出問題,我不知道哪個錯誤毛絨問我建議糾正。 –

+2

我建議查找術語「靈活數組成員」,然後刪除這個問題/答案。 – Lundin