struct声明中需要typedef

时间:2013-06-15 14:54:58

标签: c arrays struct

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

#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来创建和使用struct的单个实例?

7 个答案:

答案 0 :(得分:2)

第一种类型无效,因为您在struct之前忘记了termstr关键字。您的数据类型为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;
}

答案 1 :(得分:1)

应该是:

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

甚至更好:

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

您可以这样做:

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

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

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

并非总是需要,您只需撰写struct termstr

不要忘记free已分配的内存!

答案 4 :(得分:1)

Typedef是缩短此内容的便捷方法:

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

到此:

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

施放malloc也是一个好主意!

答案 5 :(得分:0)

如果你想在它自己的名字上使用typename,你可以使用typedef:     typedef struct {       双倍;       双b;     } termstr;

答案 6 :(得分:0)

在C中你也需要添加struct关键字,所以要么使用typedef将别名链接到'struct termstr',要么你需要编写类似

的内容
struct termstr* lptr = malloc(sizeof(struct termstr)*5);

在C ++中你可以直接引用它作为'termstr'(读:不再需要struct关键字)。