2016-09-20 15 views
-2

私は内部に別の構造体の配列を持つ構造体を持っており、構造体の初期化に問題があります。私がやろうとしています何構造体の構造体の配列を初期化する方法は?

typedef struct stack * Stack; 
typedef struct book * Book; 

struct book { 
    char *title; 
    int pages; 
}; 

struct stack { 
    int num_books; 
    Book array[50] 
}; 

はゼロ冊で、空のスタックを作成することですが、私は、私が試したすべてのセグメンテーションフォールトを取得しておきます。ここで

は私の初期化機能である:

Stack create_stack(void) { 
    Stack s = malloc(sizeof(struct stack) * 50); 
    s->num_books = 0; 
    // s->array[0]->title = Null; 
    // s->array[0]->pages = 0; 
    // the above 2 lines give a seg fault: 11 
    // I also tried: 
    // s->array = s->array = malloc(sizeof(struct book) * 50); 
    // Which gives the error that array type 'Book [50]' is not assignable 
    return s; 
} 

にはどうすればゼロ冊で、空のスタックを作成することができますか?

+2

スタックを 'sizeof(struct stack)'としてmallocする必要があります。 50冊の "配列"(typedefのためのポインタ)は、 'stack'構造体の一部として提供されます。 – Hypino

+4

ポインタをtypedefしないでください。混乱の原因となるだけです。特に、50冊の本の配列のように見えるのは、実際には50個のポインタの配列です。したがって、それらのポインタを使用する前にそれらのポインタにメモリを割り当てる必要があります。 – user3386109

+0

あなたはすでに似たような質問をしました。あなたは最初の質問で得たアドバイスに従い、先に進む前に欠陥/不具合を修正しなければなりません!そして、あなたのコードの '' struct'に '' struct'の配列はありません! – Olaf

答えて

2

struct bookオブジェクトにメモリを割り当てていません。構造体:

struct stack { 
    int num_books; 
    Book array[50]; 
}; 

bookの構造体(すなわち、Bookstruct book *に同義語である)ポインタの50の要素アレイとしてarray部材を画定します。これらはまだ "ワイルド"ポインタであり、割り当てられた構造体オブジェクトを割り当てる必要があります。言い換えれば、呼び出すことにより:

Stack s = malloc(sizeof(struct stack) * 50); 

あなたはタイプstruct stackの50個のオブジェクトのための部屋を作ってきたが、これらの構造体のそれぞれの内側に、struct bookポインタではなく、オブジェクト自体の余地があります。

コメントの中で述べたように、ポインタ型を型定義することは、コードを難読化する簡単な方法です。

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

#define SIZE 2 

typedef struct book { 
char * title ; 
int pages; 
} Book; 

typedef struct stack { 
int num_book; 
Book book_arr[SIZE]; 
} Stack; 

//------------------------------------------------ 

int main (void){ 

Stack s1; 
    printf("Enter Number of Books : "); 
    scanf("%d",&s1.num_book); 
    getchar(); 

    //BOOK 
     for(size_t j = 0 ; j < s1.num_book ; j++){ 
     char temp[100]; 
     printf("Enter the Book Title for %zd Book : ", (j+1)); 
     fgets(temp,100,stdin); 
     strtok(temp,"\n");  // for removing new line character 
    s1.book_arr[j].title = malloc (sizeof(temp) +1); 
    strcpy(s1.book_arr[j].title,temp); 
        // puts(s1.book_arr[j].title); 
     printf("Enter Pages for %zd Book : ",(j+1)); 
    scanf("%d",&s1.book_arr[j].pages); getchar(); 
     } 
      //PRINT 
size_t count = 0 ; 
     for(size_t i = 0 ; i < s1.num_book ; i++){ 
    while(count < SIZE) { 
     printf("Book Title : %s\nBook pages : %d\n",s1.book_arr[count].title, s1.book_arr[count].pages); 
     free(s1.book_arr[count].title); 
     count++; 
     } 
}  
return 0; 
} 

これは達成しようとしていることですか?

関連する問題