2015-02-02 2 views
0

Я создаю NFA и хотел бы сделать это, создав State structs, которые указывают на другие State s. Процесс построения NFA требует, чтобы я отслеживал,s указывает на NULL, а затем позже исправляйте их, когда я знаю, что State они должны указать.Почему этот указатель на структуру не указывает на правильный?

Но когда я обновляю связанный список, он не обновляет pointee State. Я думаю, что я не ссылаюсь и не корректирую указатель NULL правильно.

Вот упрощенная версия проблемного кода:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct State State; 
struct State 
{ 
    char c; 
    State *out; 
}; 

typedef struct List List; 
struct List 
{ 
    State *s; 
    // has a next member that is irrelevant here. 
}; 

State *State_new(char c, State *out) 
{ 
    State *s; 
    s = malloc(sizeof(*s)); 
    s->c = c; 
    s->out = out; 
    return s; 
} 

void *List_new(State **outpp) 
{ 
    List *slist = malloc(sizeof(*slist)); 
    /* 
    * Dereference the pointer to a pointer of a State 
    * to get a pointer to a state 
    */ 
    slist->s = *outpp; 
    return slist; 
} 

int main() 
{ 
    State *a = State_new('a', NULL); 
    List *l = List_new(&(a->out)); 

    /* This printf() will result in a seg fault, since a->out is NULL. */ 
    //printf("%c\n", a->out->c); 

    /* change what State struct is pointed to by l */ 
    l->s = State_new('b', NULL); 

    /* why is this not b? */ 
    //printf("%c\n", a->out->c); 
    return 0; 
} 
+0

Не должно быть 'sizeof (State)', а не 'sizeof (* s)'? (и то же самое для 'slist') – emlai

+1

@zenith: no, потому что' * s' является 'State', поэтому' sizeof (* s) 'и' sizeof (State) 'фактически эквивалентны. – RudolfW

ответ

1

a->out->c не 'b', потому что вы сохраняете копию указателя в элементе списка. Вы указываете параметр State** как параметр, но вы также должны хранить его как таковой. Вы могли бы просто послать State *outp и написали slist->s = outp;, если бы это было не так.

#include <stdio.h> 
#include <stdlib.h> 

typedef struct State State; 
struct State 
{ 
    char c; 
    State *out; 
}; 

typedef struct List List; 
struct List 
{ 
    State **s; //<--- HERE 
    // has a next member that is irrelevant here. 
}; 

State *State_new(char c, State *out) 
{ 
    State *s; 
    s = malloc(sizeof(*s)); 
    s->c = c; 
    s->out = out; 
    return s; 
} 

void *List_new(State **outpp) 
{ 
    List *slist = malloc(sizeof(*slist)); 
    /* 
    * Dereference the pointer to a pointer of a State 
    * to get a pointer to a state 
    */ 
    slist->s = outpp; //<<--- HERE 
    return slist; 
} 

int main() 
{ 
    State *a = State_new('a', NULL); 
    List *l = List_new(&(a->out)); 

    /* This printf() will result in a seg fault, since a->out is NULL. */ 
    //printf("%c\n", a->out->c); 

    /* change what State struct is pointed to by l */ 
    *l->s = State_new('b', NULL); 

    printf("%c\n", a->out->c); 
    return 0; 
} 
Смежные вопросы