我有以下代码:
/* 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 :(得分: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)