如何定义指向结构的指针

时间:2013-01-23 09:02:28

标签: c pointers structure

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

为什么这个编程给了我很多未声明标识符的错误?不过我已经宣布了。

这些是我得到的错误。

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

}

6 个答案:

答案 0 :(得分:4)

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

此代码定义了两件事:

  1. 名为ContactInfo
  2. 类型
  3. 名为struct
  4. contactInfo

    注意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));    
    }
    

    (我遗漏了代码中不那么有趣/未经修改的部分)

答案 1 :(得分:3)

此:

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

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

struct contactInfotypedef: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

中大写C

你正在做的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));