【问题标题】:How to create a new instance of a struct如何创建结构的新实例
【发布时间】:2015-09-15 04:37:38
【问题描述】:

创建结构的新实例的正确方法是什么?给定结构:

struct listitem {
    int val;
    char * def;
    struct listitem * next;
};

我见过两种方法..

第一种方式(xCode说这是重新定义结构,错了):

struct listitem* newItem = malloc(sizeof(struct listitem));

第二种方式:

listitem* newItem = malloc(sizeof(listitem));

或者,还有其他方法吗?

【问题讨论】:

  • "(xCode 说这是重新定义结构,错误)"。有些事情你没有告诉我们,因为第一种方法既不是重新定义结构也不是错误的。
  • @user3386109 哦,你是对的! XCode 只说这是错误的,因为我在函数中使用它,而不是 main()。不知道为什么...

标签: c struct instance


【解决方案1】:

这取决于你是否需要指针。

最好这样称呼你的结构:

typedef struct s_data 
{
    int a;
    char *b;
    // etc..
} t_data;

将其实例化为无指针结构:

t_data my_struct;
my_struct.a = 8;

如果你想要一个指针,你需要像这样 malloc :

t_data *my_struct;
my_struct = malloc(sizeof(t_data));
my_struct->a = 8

我希望这能回答你的问题。

【讨论】:

    【解决方案2】:

    第二种方法只有在你使用时才有效

    typedef struct listitem listitem;
    

    在任何类型为listitem 的变量声明之前。您也可以只静态分配结构而不是动态分配它:

    struct listitem newItem;
    

    您演示的方式就像对您要创建的每个 int 执行以下操作:

    int *myInt = malloc(sizeof(int));
    

    【讨论】:

    • 永远的简单约定:typedef Foo_tag { ... } Foo_t 并立即使用Foo_t 在 C 编程中非常有效。 typedef 确实只有打字成本,但之后它就再也不用输入 struct Foo_tag 了。
    • struct listitem newItem; 只是在文件范围内发生的静态分配。在块范围内,这是自动分配。
    • @M.M 你当然是对的,但一般来说,malloc 和朋友处理动态分配,而其他形式的分配,无论在文件中的位置如何,通常被称为“静态分配”以区别于动态分配。
    • @BitTickler 就我个人而言,我不在乎。我会注意到typedef struct List_tag List; struct List_tag { List *next, *prev; int data }; 对于需要指向正在定义的结构类型项的指针的结构效果更好。
    • 请注意,以_t 结尾的名称是为实现而保留的,应避免使用。见stackoverflow.com/a/12727104/1701799
    【解决方案3】:
    struct listitem newItem; // Automatic allocation
    newItem.val = 5;
    

    以下是结构的简要说明: http://www.cs.usfca.edu/~wolber/SoftwareDev/C/CStructs.htm

    【讨论】:

      【解决方案4】:

      除了其他答案之外,我还想添加两种更紧凑的创建实例的方法。示例:

      struct Person{
          float position[2];
          int age;
          char name[20];
      }
      struct Person p1 = { {4, 1.1}, 20, "John" };
      struct Person p2 = { .age=60, .name="Jane", .position={0, 0} };
      printf("%s, aged %i, is located at (%f, %f)\n", p1.name, p1.age,p1.position[0], p1.position[1] );
      printf("%s, aged %i, is located at (%f, %f)\n", p2.name, p2.age,p2.position[0], p2.position[1] );
      

      输出:

      John, aged 20, is located at (4.000000, 1.100000)
      Jane, aged 60, is located at (0.000000, 0.000000)
      

      请注意,对于p1,属性的顺序与结构定义的顺序相匹配。如果您不想在使用类型时一直键入 struct ,则可以使用定义新别名

      typedef struct Person SomeNewAlias;
      SomeNewAlias p1;
      

      你可以把新别名和旧名字一样调用就好了

      typedef struct Person Person;
      Person p1;
      

      【讨论】:

        猜你喜欢
        • 2015-04-08
        • 2017-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多