2016-06-27 111 views
1

我很困惑如何創建一個結構數組。這裏是我的代碼:如何創建一個結構數組

#include <stdio.h> 
#include <stdlib.h> 

typedef struct line 
{ 
    int x; 
} *line; 

int main() 
{ 
    line *array = malloc(10 * sizeof(line)); 

    int i = 0; 

    for(i; i < 2; i++) 
    { 

     array[i]->x = 5; 
    } 

    for(i; i < 2; i++) 
    { 
     printf("%d\n", array[i]->x); 
    } 

    return 0; 
} 

我的困惑來自於以下幾個:從我的理解,如果你有一個typedef,並給它一個名稱的指針如*線,那麼你可以訪問和使用的結構變異的每個項目 - >符號。我似乎沒有把握好,不知道爲什麼。

我的錯誤:

分割故障(核心轉儲)

回答

5

typedefline作爲一個指針結構,而不是結構本身。所以當你基於sizeof linemalloc -ed,你有10個指針的空間,而不是10個結構的副本。在typedef之前刪除line之前的*,以便獲得一個結構數組,而不是指向struct的(未分配的)指針數組。索引指針後,您將使用正常的點訪問。

如果你真的想要一個指向struct的指針數組,你需要分別分配每個結構,這可能不是你想要的。

0

你幾乎擁有它,你只需要調整或者您的語法或每一結構分配更多的內存:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct line 
{ 
    int x; 
} *line; 

int main() 
{ 
    line *array = malloc(10 * sizeof(line)); 

    int i = 0; 

    for(i; i < 2; i++) 
    { 
     // XXX HERE YOU ALLOCATE MORE MEMORY 
     array[i] = malloc(sizeof array[i]); 
     array[i]->x = 5; 
    } 
    // XXX RESET "i" TO ZERO 
    for(i=0; i < 2; i++) 
    { 
     printf("%d\n", array[i]->x); 
    } 

    return 0; 
} 

你也永遠不會再使用它之前重置i數組索引變量。

1

這裏,固定它爲雅:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct line 
{ 
    int x; 
} Line; 

int main() 
{ 
    Line* array = malloc(10 * sizeof(line)); 

    int i = 0; 

    for(i; i < 2; i++) 
    { 

     array[i].x = 5; 
    } 

    for(i; i < 2; i++) 
    { 
     printf("%d\n", array[i].x); 
    } 

    return 0; 
} 
+0

這將是沒有第一句口語一個更好的答案,並與你改變什麼解釋,爲什麼它很重要。 'for(i; i <2; i ++)'表示法雖然是從問題中複製過來的,但它並不好,尤其是對於第二個循環,因爲它訪問未初始化的數據而引發未定義的行爲。如果你不打算在初始化部分做任何事情,把它留空,但總是使用'for(i = 0; i <2; i ++)'或甚至(C99或更新)'for int i = 0; i <2; i ++)'並在循環之外放置'i'的定義。 –

+1

@JonathanLeffler是索引變量'我'同樣的原因對我的答案downvote以及?除了提及或者可能給出更詳細的答案之外,我沒有看到任何問題。 – tijko

+0

不是我的投票。不過,我的意見是站得住的 –