我知道这是一个非常基本的问题,但如果没有它我就无法前进,而且其他地方没有明确解释。
为什么这个编程给了我很多未声明标识符的错误?不过我已经宣布了。
这些是我得到的错误。
Error 2 error C2143: syntax error : missing ';' before 'type'
Error 3 error C2065: 'ptr' : undeclared identifier
Error 4 error C2065: 'contactInfo' : undeclared identifier
Error 5 error C2059: syntax error : ')'
Error 15 error C2223: left of '->number' must point to struct/union
以及更多......
#include<stdio.h>
#include<stdlib.h>
typedef struct contactInfo
{
int number;
char id;
}ContactInfo;
void main()
{
char ch;
printf("Do you want to dynamically etc");
scanf("%c",&ch);
fflush(stdin);
struct contactInfo nom,*ptr;
ptr=(contactInfo*)malloc(2*sizeof(contactInfo));
nom.id='c';
nom.number=12;
ptr->id=nom.id;
ptr->number=nom.number;
printf("Number -> %d\n ID -> %c\n",ptr->number,ptr->id);
}
答案 0 :(得分:4)
typedef struct contactInfo
{
int number;
char id;
}ContactInfo;
此代码定义了两件事:
ContactInfo
struct
contactInfo
醇>
注意c
和C
的差异!
在您的代码中,您使用的是两者的混合组合,这是允许的(尽管混淆了恕我直言)。
如果您使用struct
变体,则需要明确使用struct contactInfo
。对于其他变体(ContactInfo
),必须省略struct
部分,因为它是类型定义的一部分。
因此请注意结构的两种不同定义。最好只使用其中一种变体。
我手边没有Visual Studio,但是以下(更正的)代码正确编译了gcc而没有任何警告:
#include<stdlib.h>
typedef struct contactInfo
{
int number;
char id;
}ContactInfo;
void main()
{
ContactInfo nom,*ptr;
ptr=malloc(2*sizeof(ContactInfo));
}
(我遗漏了代码中不那么有趣/未经修改的部分)
答案 1 :(得分:3)
此:
ptr=(contactInfo*)malloc(2*sizeof(contactInfo));
错误,没有名为contactInfo
的类型。
有struct contactInfo
,typedef
:d为ContactInfo
。 C区分大小写(并且必须包含struct
,而不像它在C ++中的工作方式。)
另请注意,引用的行更好地写为:
ptr = malloc(2 * sizeof *ptr);
自casting the return value of malloc()
is a bad idea in C以来,我删除了演员。此外,重复该类型是一个坏主意,因为它会导致引入错误的风险更大,所以我也删除了它。
请注意,sizeof *ptr
表示“ptr
指向的类型的大小”并且是非常方便的事情。
答案 2 :(得分:0)
替换
ptr=(contactInfo*)malloc(2*sizeof(contactInfo));
带
ptr=malloc(2*sizeof(struct contactInfo));
答案 3 :(得分:0)
C是区分大小写的语言。
ptr=(contactInfo)malloc(2*sizeof(contactInfo));
应该是:
ptr=malloc(2*sizeof(ContactInfo));
答案 4 :(得分:0)
struct contactInfo nom,*ptr;
ptr=(contactInfo*)malloc(2*sizeof(contactInfo));
由于您已定义了typedef,
上面的第一个陈述可以写成如下,尽管你所写的内容也是正确的但是并没有有效地使用你定义的typedef
。
ContactInfo nom,*ptr;
此外,由于C
是区分大小写的语言,请按照您在typedef中的定义使用。在contactinfo
你正在做的typecasting
不应该被认为是一种不好的做法。在void *
的情况下,malloc
会自动安全地提升为任何其他指针类型。
ptr=malloc(2*sizeof(ContactInfo));
答案 5 :(得分:-1)
struct contactInfo nom,*ptr;
ptr=(contactInfo*)malloc(2*sizeof(contactInfo));
这里你使用contactInfo来打字,因为它应该是struct contactInfo。当你将其输入到ContactInfo中时,你也可以使用它。
struct contactInfo nom,*ptr;
ptr=(ContactInfo*)malloc(2*sizeof(ContactInfo));