如何定义一个指向结构体的指针

6

我知道这是一个非常基本的问题,但是如果没有解决它,我就无法继续前进,而且其他地方也没有清楚地解释。

为什么我的编程会给我那么多未声明标识符的错误?虽然我已经声明了它。

以下是我收到的错误信息。

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);

}

永远不要在stdin上调用fflush - 这是未定义的行为。 - Paul R
也许你应该更加认真地阅读C语言书籍。 - Aniket Inge
@PaulR 为什么?我看过,每当您需要使用 scanf 从用户处获取两个输入时,都要执行 fflush 以删除管道中的 \n? - SLearner
1
@shashlearner:fflush 仅适用于输出或更新流 - 对于输入流,请使用 fpurge,或者只需调用 getchar() 来丢弃不需要的字符。 - Paul R
@PaulR 好的。但代码仍有问题。我已经删除了类型转换并使用了sizeof *ptr,但仍然有20个错误! - SLearner
5个回答

5
typedef struct contactInfo
{
    int number;
    char id;
}ContactInfo;

这段代码定义了两件事:
  1. 一个名为 ContactInfo 的类型
  2. 一个名为 contactInfostruct
注意 cC 的区别!
在您的代码中,您混合使用了这两种变量,这是允许的(尽管我认为会令人困惑)。
如果您使用 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));    
}

(我省略了代码中不那么有趣/未修改的部分)


我尝试过了,但它没有起作用。我认为还有其他问题吗? - SLearner
我在我的答案中添加了一个修复后可以使用gcc编译的版本,以展示所需的更正。 - Veger

3

这个:

ptr=(contactInfo*)malloc(2*sizeof(contactInfo));

错误,没有名为contactInfo的类型。

有一个名为contactInfo的结构体,它被定义为ContactInfo。C语言是区分大小写的(与C++不同,必须包含struct关键字)。

还要注意引用的这一行最好写成:

ptr = malloc(2 * sizeof *ptr);

由于在C语言中强制转换malloc()的返回值是一个不好的想法,所以我删除了强制转换。此外,重复类型是一个不好的想法,因为它增加了引入错误的风险,因此我也删除了它。

请注意,sizeof *ptr表示"指针ptr指向的类型的大小",这是非常方便的。


如果我不对malloc进行类型转换,它会返回char类型吗? - SLearner
好的,我已经删除了类型转换,但仍然显示相同的错误。我正在使用VS 2010,并将编译器更改为c\tc。 我仍然不明白问题在哪里@unwind。谢谢! - SLearner

0

替换

ptr=(contactInfo*)malloc(2*sizeof(contactInfo));

ptr=malloc(2*sizeof(struct contactInfo));

我尝试过了,但还是不行。是 VS 2010 编译器搞砸了吗?几乎所有的错误都指向 ptr=(contactInfo*)malloc(2*sizeof(contactInfo)); 这一行。 而且去掉类型转换会给程序增加更多的错误 :/ - SLearner
@akp:请参考https://dev59.com/dHRB5IYBdhLWcg3wgHWr - Paul R
好的 - 如果您修正了您的答案,我会很高兴地取消投票。 - Paul R

0

C语言是一种大小写敏感的编程语言。

ptr=(contactInfo)malloc(2*sizeof(contactInfo));

应该改为:

ptr=malloc(2*sizeof(ContactInfo));


contactInfoContactInfo 是两个不同的东西。所以除了大小写敏感外,这是需要记住的事情! - Veger
我同意,contactInfo是一个结构体标签,ContactInfo是该结构体的typedef。如果我没错的话@Veger - Aniket Inge
没错,这就是为什么我评论说大小写敏感性不是唯一的问题。 - Veger

-1
struct contactInfo nom,*ptr;
ptr=(contactInfo*)malloc(2*sizeof(contactInfo));

在这里,你正在使用contactInfo进行类型转换,而实际上应该使用struct contactInfo。并且,由于你已经将其typedef为ContactInfo,你也可以使用它。

    struct contactInfo nom,*ptr;
    ptr=(ContactInfo*)malloc(2*sizeof(ContactInfo));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接