Я создаю 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;
}
Не должно быть 'sizeof (State)', а не 'sizeof (* s)'? (и то же самое для 'slist') – emlai
@zenith: no, потому что' * s' является 'State', поэтому' sizeof (* s) 'и' sizeof (State) 'фактически эквивалентны. – RudolfW