我有这些声明:
typedef struct egObject {
int magicnumber;
} egObject;
typedef struct egObject* ego;
ego e;
//printf("%d",e->magicnumber);
我想从e
中获取magicnumber,但e->magicnumber
不起作用。这样做的正确方法是什么?
答案 0 :(得分:5)
当您声明struct
时,您为struct
分配内存:
egObject e;
当您声明指向struct
,typedef
编辑的指针时,您会为指针分配空间,但不会为struct
分配空间。要访问struct
的字段,您需要先分配struct
。您执行此操作的特定方式无关紧要 - 您可以静态,动态或在自动存储中分配它,但您必须为其分配一些内存:
ego e = malloc(sizeof(*e));
这足以访问该字段进行写入。读取该字段需要初始化,因为malloc
- ed块在分配给magicnumber
的区域中包含未初始化的字节:
e->magicnumber = 123;
现在,您可以按照代码的方式打印magicnumber
:
printf("%d",e->magicnumber);
注意:如果您选择使用malloc
进行动态分配,则在完成使用后需要free
该对象:
free(e); // Avoid memory leaks
答案 1 :(得分:3)
第ego e;
行与struct egObject *e
基本相同。问题是这一行只为指向struct的指针分配内存它永远不会为 struct 分配内存。因为你从来没有真正构建一个结构,所以没有理由能够访问它的一个成员。
要正确执行此操作,您可以:
struct egObject obj; //allocate one struct
ego e = &obj; //allocate one pointer to struct and
// fill that pointer with the address of your struct
//e now 'points' to 'obj'
//so you can use e->magicnumber
答案 2 :(得分:0)
以下是如何打印magicnumber
或egObject
(指向ego
的指针)的egObject
元素的示例:
#include <stdio.h>
typedef struct egObject {
int magicnumber;
} egObject;
typedef struct egObject* ego;
int main ()
{
egObject eo =
{
.magicnumber = 42
};
ego e = &eo;
printf("eo.magicnumber = %d\n",eo.magicnumber);
printf("e->magicnumber = %d\n",e->magicnumber);
return 0;
}
结果:
> ./test
eo.magicnumber = 42
e->magicnumber = 42
>