2015-04-12 1 views
-1

Я столкнулся с проблемой, когда работает мое «TEST INSIDE BUILD», но не «TEST OUTSIDE». Фрагмент кода здесьСтруктурные указатели ведут себя по-разному в двух разных функциях, не уверены, почему

command_t build_op_command(unsigned code, command_t comone, command_t comtwo) 
{ 
    commad_t s; 
    s=malloc(sizeof(*s)); 
    switch(code) 
    { 
    case 5: 
     s->type=SEQUENCE_COMMAND; 
    ... 
    } 
    s->status=-1; 
    s->input=NULL; 
    s->output=NULL; 
    s->u.command[0]=comone; 
    s->u.command[1]=comtwo; 
    printf("TEST INSIDE BUILD: %d and %s",s->u.command[0]->type, s->u.command[0]->u.word[0]); 
    s->u.word=NULL; 
    s->u.subshell_command=NULL; //not yet implemented 
    return s; 
    } 

и

... 
command_t op_command; 
op_command=build_op_command(op_pop(op_s),comone,comtwo); 
printf("TEST OUTSIDE: %d and %s",op_command->u.command[0]->type,op_command->u.command[0]->u.word[0]); 
... 

command_t является указателем для команды STRUCT. Я не совсем уверен, почему он правильно работает внутри функции сборки, но не работает правильно за ее пределами. Любой вход был бы весьма признателен. Я столкнулся с ошибкой сегментации, я попытался выделить пространство для s-> u.word, но это ничего не помогло.

struct command 
{ 
    enum command_type type; 
    int status; 
    char *input; 
    char *output; 

    union 
    { 
    struct command *command[2]; 
    char **word; 
    struct command *subshell_command; 
    } u; 
}; 

typeder struct command *command_t; 
+0

Действительно ли это 'u' союз? –

+0

Да, извините за туманность. Кодирование получилось чрезвычайно тяжелым, и я не могу понять, что происходит. Возможно, мне нужно будет выделить пространство для объединения, но это не имеет смысла, потому что я сохраняю u.word в порядке без проблем. – Jack

+0

Вы столкнетесь с той же проблемой, если переместите свой тест после 's-> u.word = NULL;', это не имеет никакого отношения к функциям. –

ответ

1

Вы не даете достаточно информации, публикуйте определение command_t.

u, вероятно, в union:

s->u.command[0]=comone; 
s->u.command[1]=comtwo; 
printf("TEST INSIDE BUILD: %d and %s",s->u.command[0]->type, s->u.command[0]->u.word[0]); 

После первого Printf, инициализация других членов этого union и переопределить command:

s->u.word=NULL; 
s->u.subshell_command=NULL; //not yet implemented 

На следующем printf отчете разного содержания.

Все члены union имеют одинаковое расположение в памяти, вы не можете использовать более одного члена одновременно.

+0

Итак, в этом случае все три команды будут использовать одно и то же объединение? Это первый случай с профсоюзом, который меня смущает. Итак, все команды, созданные в этой области, имеют общий союз? Если это так, я могу понять, почему s-> u.command [0] -> u.word [0] может вызвать проблемы, но почему s-> u.command [0] -> type также создает проблемы ? – Jack

+0

@Jack: все члены каждого 'union u' имеют одинаковое пространство. Вы не можете инициализировать более одного из них и должны читать только тот, который вы написали. Различные экземпляры этого 'union' не пересекаются, если они действительно правильно распределены. В вашем случае член 'type' структуры' command_t' должен сообщить вам, какой член 'u' должен получить доступ. – chqrlie

Смежные вопросы