如何访问union内部结构?

时间:2012-01-27 06:49:23

标签: c pointers struct unions

我有以下代码:

/* 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 个答案:

答案 0 :(得分:2)

您的malloc()行不正确:

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

应该是:

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

删除*中的sizeof()。否则,你只是为指针而不是结构本身分配足够的东西。

此外,C中不需要演员。

答案 1 :(得分:1)

这不是访问元素的问题。这就是你正确做的所有事情。

以下是一些错误的事情。首先,您没有为hermes结构分配足够的空间,仅足以指针。然后,即使您malloc( sizeof ( struct hermes ) );,一个元素(api)也是未初始化的指针。你不能只是将未初始化的指针深入到数据结构中,因为它们将指向谁知道内存中的位置。您首先需要为h->api分配一些东西来指向。然后你需要为h->api->search_response分配空间。如果你纠正了这一切,那么你正在复制一个字符串...谁知道在哪里?您应该使用strdup而不是strcpy来创建新字符串,然后您应该将返回值分配给result_code。此外,你的联盟只有一个元素,所以它有点毫无意义(除非你没有发布更多内容)。

编辑以下是初始化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),因此如果您不这样做,则不会造成任何伤害。

答案 2 :(得分:1)

使用此结构:

#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)