2013-05-22 61 views
0

我想用戶定義的數組的大小在程序啓動時,我目前有:如何使結構體在C用戶定義的數組

#define SIZE 10 
typedef struct node{ 
    int data; 
    struct node *next; 
} node; 

    struct ko { 
    struct node *first; 
    struct node *last; 
} ; 

struct ko array[SIZE]; 

這個工作,但是,我想除去#define SIZE,讓大小是用戶定義的值,所以在主函數中我有:

int SIZE; 
printf("enter array size"); 
scanf("%d", &SIZE); 

我怎麼可以得到價值的陣列?

編輯:

typedef struct node{ 
    int data; 
    struct node *next; 
    } node; 

    struct ko { 
    struct node *first; 
    struct node *last; 
    } ; 

struct ko *array; 
int size; 

,這在main.c文件:

printf("size of array: "); 
scanf("%d", &size); 
array = malloc(sizeof(struct ko) * size); 
若本工作

現在我有在.h文件下面?它沒有程序崩潰,但我不知道,如果問題 是在這裏或在其他程序中...

+0

使用動態內存分配'malloc' –

+4

可以在C99使用此語法。這裏是一個鏈接:http://stackoverflow.com/questions/737240/c-c-array-size-at-run-time-w-o-dynamic-allocation-is-allowed –

回答

5

相反的struct ko array[SIZE];,動態地分配它:

struct ko *array; 
array = malloc(sizeof(struct ko) * SIZE); 

確保釋放它一旦你用它做:

free(array); 
+0

你介意檢查我添加的新代碼嗎?謝謝 – user2408804

+0

@ user2408804我不確定你想要創建什麼,所以很難說,但看起來你正在實現一個鏈表。內存分配部分看起來在語法上是正確的,但是你實際上並沒有鏈接列表,這會導致'first','last'中的無效指針,並且'struct ko'被分配'SIZE'次而不是'結構節點「。我幫助你的代碼是將'struct ko [10]'改爲'struct ko [SIZE]'的直接解決方案,但是你的初始代碼也是錯誤的。 –

+0

是的,它是一個鏈接列表數組,程序運行良好,原始數組的靜態分配,但我似乎無法得到它與動態分配工作..無論如何,感謝您的答覆 – user2408804

3

聲明array爲指針和動態使用malloc分配所需的存儲空間:

struct ko* array; 

int SIZE; 
printf("enter array size"); 
scanf("%d", &SIZE); 

array = malloc(sizeof(struct ko) * SIZE); 

// don't forget to free memory at the end 
free(array); 
+0

你介意檢查我添加的新代碼?謝謝 – user2408804

0

您可以使用動態內存分配,使用malloc()庫函數:

struct ko *array = malloc(SIZE * sizeof *array); 

注意,使用全部大寫的變量是非常罕見的在C,風格明智它是相當混亂。

當您正在使用分配這樣內存中完成時,指針傳遞給free()函數來解除分配存儲器:

free(array); 
+0

你介意檢查我添加的新代碼嗎?謝謝 – user2408804

-1

陣列的大小是在編譯時定義,C不允許我們在運行時指定數組的大小。這被稱爲靜態內存分配。當我們處理的數據本質上是靜態的時候,這會很有用。但不能總是處理靜態數據。當我們必須存儲一個本質上是動態數據的數據意味着數據大小在運行時會發生變化,靜態內存分配可能會成爲一個問題。

要解決此問題,我們可以使用動態內存分配。它允許我們在運行時定義大小。它在請求的大小和類型的匿名位置爲我們分配一個內存塊。使用這個內存塊的唯一方法是通過指針。 malloc()函數用於動態內存分配,它返回一個可用於訪問分配位置的指針。

例 -

假設我們正在處理的整型值,整數的數量是不固定的,是動態的。

使用整型陣列來存儲這些值將不會是有效的。

int A[SIZE]; 

動態內存分配。

int *A; 
    A = (int*) malloc(SIZE * sizeof(int)); 

注:類似的概念適用於結構。成爲分配的動態內存可以是任何類型。

+0

'(int)malloc()'應該是'(int *)malloc()',也不是必須的,因爲它是'void *'。 –

+0

我編輯它。謝謝。 – siddstuff

+0

你介意檢查我添加的新代碼嗎?謝謝 – user2408804