【问题标题】:typedef required in struct declaration结构声明中需要 typedef
【发布时间】:2013-06-15 14:54:57
【问题描述】:

我正在尝试创建一个结构元素数组,如下所示:

#include <stdio.h>
#include <stdlib.h>

struct termstr{
double coeff;
double exp;
};

int main(){

termstr* lptr = malloc(sizeof(termstr)*5);

return 0;
}

当我编译这个时,我得到如下错误:

term.c: In function ‘main’:
term.c:11:1: error: unknown type name ‘termstr’
term.c:11:31: error: ‘termstr’ undeclared (first use in this function)

但是,当我将代码更改为以下代码时,它会照常编译:

#include <stdio.h>
#include <stdlib.h>

typedef struct termstr{
double coeff;
double exp;
}term;

int main(){

term* lptr = malloc(sizeof(term)*5);

return 0;
}

我添加了 typedef(类型名称为 term),将 struct 的名称更改为 termstr,并以 term* 作为指针类型分配内存。

在这种情况下是否总是需要 typedef,即创建结构数组?如果不是,为什么第一个代码会出错?是否也需要 typedef 来创建和使用结构的单个实例?

【问题讨论】:

标签: c arrays struct


【解决方案1】:

第一种类型不起作用,因为您在 termstr 之前忘记了 struct 关键字。您的数据类型是struct termstr,但不仅仅是termstr。当您typedef 时,生成的名称将用作struct termstr 的别名。

即使您不需要这样做。使用typedef 更好:

顺便别忘了释放内存:

阅读why to use typedef?

你的工作代码应该是:

#include <stdio.h>
#include <stdlib.h>

struct termstr{
  double coeff;
  double exp;
};

int main(){

struct termstr* lptr = malloc(sizeof(struct termstr)*5);
free(lptr);
return 0;
}

【讨论】:

    【解决方案2】:

    应该是:

    struct termstr * lptr = malloc(sizeof(struct termstr)*5);
    

    甚至更好:

    struct termstr * lptr = malloc(sizeof(*lptr)*5);
    

    【讨论】:

      【解决方案3】:

      在 C 中,数据类型的名称是“struct termsstr”,而不仅仅是“termstr”。

      【讨论】:

        【解决方案4】:

        你可以这样做:

        typedef struct termstr{
           double coeff;
           double exp;
        } termstrStruct;
        

        然后你只能使用termstrStruct 作为结构的名称:

        termstrStruct* lptr = malloc(sizeof(termstrStruct)*5);
        

        并不总是需要,你可以简单地写struct termstr

        别忘了free分配的内存!

        【讨论】:

        • 虽然这是完全有效的,但我认为它是代码混淆,将不同的东西命名为相同的东西。
        • 同意。我不知道他所说的这个结构到底是什么意思,但我将它编辑为具有不同的名称。
        【解决方案5】:

        Typedef 是一种方便的缩短方式:

        struct termstr* lptr = (struct termstr*)malloc(sizeof(struct termstr)*5);
        

        对此:

        typedef struct termstr* term;
        term* lptr = (term*)malloc(sizeof(term)*5);
        

        铸造 malloc 也是一个好主意!

        【讨论】:

        • 铸造 malloc 是一个糟糕的主意。国际海事组织。 (顺便说一句:你需要一个额外的星号)
        • 为什么在 C 中强制转换 malloc() 是不必要的,甚至是一个坏主意:stackoverflow.com/a/605858/694576
        • 嗯,我的教授总是说选角是更好的风格。好吧,你每天都能学到新东西!
        • 一般规则:当你可以选择施放或不施放时,施放是糟糕的风格。强制转换意味着告诉编译器“不,你错了,我知道得更好”。如果你没有告诉编译器这个,不要;编译器的工作是帮助你解决它的抱怨。
        【解决方案6】:

        如果你想单独使用类型名 termstr,你可以使用 typedef: 类型定义结构 { 双a; 双乙; } 术语;

        【讨论】:

          【解决方案7】:

          在 C 中,您还需要添加 struct 关键字,因此您可以使用 typedef 将别名与 'struct termstr' 链接起来,或者您需要编写类似的东西

          struct termstr* lptr = malloc(sizeof(struct termstr)*5);
          

          但是,在 C++ 中,您可以直接将其引用为“termstr”(阅读:此处不再需要 struct 关键字)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-04-26
            • 1970-01-01
            • 2023-03-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多