2012-01-27 13 views
1

私は、次のコードを持っている:私は要素にアクセスしようとしたとき、私はセグメンテーションフォールトを取得ユニオンの内部構造にアクセスするには?

/* sample.c */ 
    #include<stdio.h> 
    #include<malloc.h> 
    #include<stdlib.h> 
    #include"hermes.h" 
    #include<string.h> 

    int main(){ 
     struct hermes *h ; 
     h = (struct hermes *) malloc (sizeof (struct hermes *)); 

     strcpy (h->api->search_response->result_code , "123"); 
      printf("VALue : %s\n" , h->api->search_response->result_code); 
     return 0; 
    } 

/* hermes.h */ 
    struct hermes { 

    union { 

      /* search response */ 
        struct { 
          int error_code; 
          char *result_code; 
          char *user_track_id; 
          struct bus_details bd; 
        }*search_response; 

     }*api; 
    }; 

を。誰もが、これらの要素にアクセスする正しい方法は何か教えていただけますか?

+0

#define MAX 512 /* any number you want*/ struct hermes { union { /* search response */ struct { int error_code; char result_code[MAX]; char user_track_id[MAX];/* can use different sizes too*/ struct bus_details bd; }search_response[MAX];/* can use different sizes too*/ }*api; }; 

それとも、あなたの現在の構造体を使用したい場合は、同様にポインタ要素ををmalloc。おそらくCでの経験がないのですが、どのような構造が役に立つのか分かりません。ここでポイントは何ですか? –

答えて

1

使用この構造体:あなたは、構造体の内部の労働組合の内部構造体を持っている

h->api = malloc((sizeof(int)+sizeof(char)*MAX*2+sizeof(struct bus_details))*MAX) 
2

あなたmalloc()行が正しくありません:

h = (struct hermes *) malloc (sizeof (struct hermes *)); 

は次のようになります。

h = (struct hermes *) malloc (sizeof (struct hermes)); 

sizeof()*を削除します。さもなければ、あなたは構造体そのものではなく、ポインタのためだけに十分な割り当てをしています。

また、キャストはそれが要素にアクセスする問題ではないC.

+0

または、おそらく 'h = malloc(sizeof * h); – cnicutar

+0

結果は同じです – abubacker

+1

また、構造体のポインタを初期化する必要があります。あなたのコードは今のところ、 'h-> api'はぶら下がっているポインタです。だからあなたがそれを尊重しようとすると、seg-faultになります。 – Mysticial

1

には必要ありません。それはあなたが正しくやっているすべてのことです。

ここでは間違っていることがいくつかあります。まず、hermes構造体のための十分な領域を割り当てず、ポインタのために十分です。その後、malloc(sizeof (struct hermes));の場合でも、1つの要素(api)は初期化されていないポインタです。初期化されていないポインタは、どこにあるのかを誰が知っているかを指し示すため、データ構造の深いところまで追跡することはできません。まず、h->apiがポイントするために何かを割り当てる必要があります。次に、h->api->search_responseのスペースを割り当てる必要があります。あなたがそれをすべて訂正すれば、文字列をコピーしています...誰がどこを知っていますか?新しい文字列を作成するにはstrdupstrcpyではなく、に戻り値を割り当てる必要があります。また、あなたのユニオンには要素が1つしかないので、無意味です(あなたが投稿していないことがそれ以上ない限り)。自身の後にクリーンアップ行儀のプログラムでは、これらの割り当てのそれぞれが、逆に、同様に個別に解放されなければならないことを

h = malloc(sizeof(struct hermes)); 
h->api = malloc(sizeof(*h->api)); 
h->api->search_response = malloc(sizeof(h->api->search_response)); 
h->api->search_response->result_code = strdup("123"); 

注:

EDITはここhを初期化する一つの方法ですmallocへの呼び出しの順序。ただちにexit(0)に電話をかけるので、そうしないと害はありません。

+0

h-> apiとh-> api-> search_responseにメモリを割り当てる方法を説明できます – abubacker

+0

@abubacker - 私は私の答えに追加しました –

関連する問題