2017-10-23 9 views
1

私はsegmentation fault: 11を取得し続ける構造体の初期化を持っています。私はGDBあたりのエラーを取得するのはここmain.cリサイズ可能な配列を持つリスト構造体を初期化する適切な方法

typedef struct { 
    int id; 
    double value; 
    char* name; 
} Item; 

typedef struct { 
    Item** items; 
    int length; 
    int capacity; 
} List; 

List* initList() 
{ 
    List* list = NULL; 
    list->items = (Item**)malloc(10 * sizeof(Item*)); 
    list->length = 0; 
    list->capacity = 10; 
    return list; 
} 

は次のとおりです。

List* list = initList(); 

私はCに新しいです

list->items = (Item**)malloc(10 * sizeof(Item*)); 

に問題があるので、私は気付か、初期化できません私のinitList関数は指定された代入を持つリストを作成すると確信しています。私はitemsを無料でinitListにそれぞれ持っています。

+0

'List * list = NULL;'あなたは 'List'構造体を割り当てませんが、次の行にそれを埋めています。未定義の動作。 –

+0

'リスト*リスト= NULL; list-> items = ... 'です。 'list'はNULLを参照しています。 – MFisherKDX

+0

'List * list = NULL;を記述した後、次の行' list-> items = ... 'は' NULL'ポインタをデリバティブしています。 –

答えて

1

問題はここにある:

List* list = NULL; 
list->items = (Item**)malloc(10 * sizeof(Item*)); 

あなたがそれを別の値を与えることなくlist間接参照し、その後、NULL値でlistを初期化します。 NULLポインタを参照解除すると、undefined behaviorが呼び出されます。

listのメモリを割り当てる必要があります。そして、あなたはそれを間接参照することができます:

List* list = malloc(sizeof(List *)); 
if (!list) { 
    perror("malloc failed"); 
    exit(1); 
} 
list->items = malloc(10 * sizeof(Item*)); 
if (!list->items) { 
    perror("malloc failed"); 
    exit(1); 
} 

また、you shouldn't cast the return value of mallocこと、およびエラーをチェックすることを忘れないでください。

+0

いつも素早く。 –

1

list->items = (Item**)malloc(10 * sizeof(Item*)); 

で右側は問題ではありません。問題は、listNULLを指しているため、そのフィールドの1つに何かを割り当てることは、未定義の動作です。

ポインタの代わりに構造体を返すことで、この割り当てを避けることができます。構造体を動的に割り当てる必要はなく、固定サイズです。

List initList() 
{ 
    List list; 
    list.items = malloc(10 * sizeof(Item*)); 
    list.length = 0; 
    list.capacity = 10; 
    return list; 
} 

、発信者:

List list = initList(); 

コピーのオーバーヘッドが非常に小さいですが、何のために別の動的に割り当てられたポインタを持っていないことの利点は大きいです。

+0

'List list = NULL; is legal?私はいつも 'memset'を使用しました – MFisherKDX

+0

いいえ、古いコードのほんの一部です。ありがとう –

関連する問題