c - '->' doesnt doesn' t 适用于结构内部的结构

标签 c struct

typedef struct {
    char name[3];
    bool initial_state;
    bool final_state;
    struct TRANSITION *transitions;
    int numberTransition;
} STATE;

typedef struct {
    char c;
    struct STATE *destination;
} TRANSITION;

STATE *create_state(char *name, bool is_initial, bool is_final);
void add_transition(STATE *source, char sign, STATE *dest);
void destroy_state(STATE **pp_state);

int main(void) {
    STATE *state1 = create_state("S'0", true, false);
    STATE *state2 = create_state("S'1", true, false);
    STATE *state3 = create_state("S'2", true, false);
    printf("%s  ", state1->name);
    printf("%d  ", state1->initial_state);
    printf("%d  ", state1->final_state);
    add_transition(state1, 'A', state2);
    TRANSITION *transitions = state1->transitions;
    printf("%c  ", transitions[0].c);
}

如您所见,我访问了 state1 结构。它实际上适用于 nameinitial_statefinal_state。但由于某种原因,它不适用于 state1->transitions。我想因为它本身就是一个结构,所以我必须做点别的事情。

这行有什么问题?:

TRANSITION *transitions = state1->transitions;

最佳答案

问题是结构名称,如 struct STATE,存在于它们自己的命名空间中,与类型别名等内容所在的 C 命名空间的其余部分分开(我的意思是类型别名)使用 typedef 创建的符号)。

如果你这样做,例如

typedef struct STATE_STRUCTURE { ... } STATE_TYPE;

您定义两个不同的符号,首先是结构名称STATE_STRUCTURE,然后是类型别名STATE_TYPE。要使用 STATE_STRUCTURE,您可以使用 struct 关键字,如

struct STATE_STRUCTURE *state;

如果没有实际定义结构名称,则无法使用结构名称。这就是您在结构定义中所缺少的内容。

另请注意,由于结构名称存在于自己的命名空间中,就像我之前所说的那样,您可以使结构名称与类型别名相同:

typedef struct STATE { ... } STATE;
<小时/>

我针对您的问题提出的解决方案是使用结构和类型别名的前向声明:

typedef struct STATE STATE;
typedef struct TRANSITION TRANSITION;

这告诉编译器存在名为 STATETRANSITION 的结构,并且它们是具有相同名称的这些结构的类型别名。

然后您只需定义结构本身,并且由于我们已经声明了类型别名,您可以在结构中使用它们:

struct STATE
{
    char name[3];
    bool initial_state;
    bool final_state;
    TRANSITION *transitions;
    int numberTransition;
};

struct TRANSITION
{
    char c;
    STATE *destination;
};

关于c - '->' doesnt doesn' t 适用于结构内部的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35682634/

相关文章:

c - c中特定嵌套循环的时间复杂度

c - OpenGL - 绘制正弦曲线的切线和法线

c - 在两个不同的头文件中的两个结构中包含循环依赖是错误的吗?

go - 使用 new 初始化嵌套结构

c++ - 将结构数组传递给 C++ 中的函数并出现错误

c - DEFINE_PER_CPU 定义指向结构的指针数组

ios - ObjectiveC 测试 int 是 long 还是 not/CGFloat 是 float 还是 double

c - 我的信号处理程序有什么问题?

pointers - 将局部变量的指针传递给 Golang 中的 channel 是否安全?

c++ - 结构成员初始化