为什么通过typedef-ed指针访问struct的字段不起作用?

时间:2014-05-29 16:20:19

标签: c struct typedef

我有这些声明:

typedef struct egObject {
    int  magicnumber;
} egObject;
typedef struct egObject* ego;

ego e;
//printf("%d",e->magicnumber);

我想从e中获取magicnumber,但e->magicnumber不起作用。这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:5)

当您声明struct时,您为struct分配内存:

egObject e;

当您声明指向structtypedef编辑的指针时,您会为指针分配空间,但不会为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)

以下是如何打印magicnumberegObject(指向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
>