Gcc 从结构化指针对象获取成员

Gcc 从结构化指针对象获取成员,gcc,struct,typedef,Gcc,Struct,Typedef,我有以下c(gcc)格式的表格: 如何从该类型的结构中获取特定的成员,并使用objvar初始化?首先,该声明无效,您试图声明标识符为数字的成员。我假设你真的想要这个: typedef struct foo { int mem_1; int mem_2; ... } *obj; 使用点()访问普通结构成员: 这很好,编译器会自动分配正确大小的堆栈空间。 现在,由于您的obj var是一个指针1,我们将使用箭头(->)访问其成员: 当然,如果你幸运的话,这会是你的错。如果不

我有以下c(gcc)格式的表格:


如何从该类型的结构中获取特定的成员,并使用
objvar初始化

首先,该声明无效,您试图声明标识符为数字的成员。我假设你真的想要这个:

typedef struct foo {
    int mem_1;
    int mem_2;
    ...
} *obj;
使用点(
)访问普通结构成员:

这很好,编译器会自动分配正确大小的堆栈空间。 现在,由于您的
obj var
是一个指针1,我们将使用箭头(
->
)访问其成员:

当然,如果你幸运的话,这会是你的错。如果不是这样,您可能需要与调试器进行一次非常长且富有启发性的会话。与声明
struct foo
本身不同,声明
obj var
或其等价物
struct foo*var
只创建未初始化的指针。您需要自己为此提供内存:

obj var = malloc(sizeof(*var));
请注意,这只是提供内存,其内容仍然未定义,但您可以安全地分配给它们

1:这就是
typedef
像你这样把指针扔掉的问题;如果没有看到typedef或编译器的警告,就不可能知道是否需要使用
->
。不要使用
typedef
隐藏指针。

1
2
不是有效的结构成员标识符,除非您在某个地方有
mem
的定义,否则它不是有效的类型。但是,给定一个有效的
结构定义以及该类型的对象或指向该类型对象的有效指针,您需要
*
->
运算符,具体取决于具体情况。。。
struct foo bar;
bar.mem_1 = 2;
obj var;
var->mem_1 = 3;
obj var = malloc(sizeof(*var));