Как получить доступ к объединению внутри структуры? - PullRequest
1 голос
/ 27 января 2012

У меня есть следующий код:

/* 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;
    };

Я получаю ошибку сегментации, когда пытаюсь получить доступ к элементам. Может кто-нибудь сказать мне, как правильно получить доступ к этим элементам?

Ответы [ 3 ]

2 голосов
/ 27 января 2012

Ваша строка malloc() неверна:

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

должно быть:

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

Удалите * в sizeof(). В противном случае вы выделяете достаточно только для указателя, а не для самой структуры.

Кроме того, приведение не обязательно в C.

1 голос
/ 27 января 2012

Используйте эту структуру:

#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 элемент указателя, например:

 h->api = malloc((sizeof(int)+sizeof(char)*MAX*2+sizeof(struct bus_details))*MAX)
1 голос
/ 27 января 2012

Это не проблема доступа к элементам.Это все, что вы делаете правильно.

Вот некоторые вещи, которые не так.Во-первых, вы не выделяете достаточно места для hermes структуры, просто для указателя.Тогда, даже если вы malloc( sizeof ( struct hermes ) );, один элемент (api) является неинициализированным указателем.Вы не можете просто следовать неинициализированным указателям вглубь структуры данных, потому что они будут указывать на то, кто знает, где находится память.Сначала вам нужно выделить что-то, на что h->api будет указывать.Тогда вам нужно выделить место для h->api->search_response.Если вы все это исправите, то скопируете строку в ... кто знает где?Вы должны использовать strdup, а не strcpy, чтобы создать новую строку, тогда вы должны присвоить возвращаемое значение result_code.Кроме того, в вашем союзе есть только один элемент, поэтому он бессмысленно (если только вы не отправили в него что-то еще).

EDIT Вот один из способов инициализации h:

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" );

Обратите внимание, что в программе с хорошим поведением, которая выполняет очистку после себя, каждое из этих выделений также должно быть освобождено по отдельности, в порядке, обратном вызовам malloc.Поскольку вы немедленно звоните exit(0), в этом случае никакого вреда не будет.

...