0

我正在编译这段代码,但出现编译错误,提示“取消引用指向不完整类型的指针”。我得到了最后一个打印语句的错误,在此之前我尝试指向 (*temp)。num 到 b 的地址

void main()
{

    struct {
        int xx;
        char *y;
        int * num;
        struct x *next;
    }x;

    struct x* temp;
    int b = 10;

    temp = ((struct x *)malloc(sizeof(x)));

    (*temp).num = &b;

    x.next = temp ;

    printf(" %d\n",temp->num, x.next->num);

}
4

5 回答 5

5

问题是声明:

struct {
   ...
} x;

定义了一个未命名的实例“x”——不是一个命名的类型“x”。

因此,当您从那里引用“struct x”时,编译器所知道的就是您需要一些“x”类型的指针——稍后您将定义它(而您永远不会这样做)。

要定义命名类型“x”,您需要:

struct x {
   ...
};
于 2009-11-06T14:46:01.710 回答
0

除了 Draemon 所写的内容之外struct x {...} x,我还冒昧地纠正了其他各种小问题,例如printf()

void main()
{
  struct x {
    int xx;
    char *y;
    int *num;
    struct x *next;
   } x;
   struct x* temp;
   int b = 10;
   temp = ((struct x *)malloc(sizeof(struct x)));
   (*temp).num = &b;
   x.next = temp ;
   printf("%d %d\n",*temp->num, *x.next->num);
}

只是出于好奇:你想达到什么目的?

于 2009-11-06T14:50:42.483 回答
0

我想你的意思是:

struct x {
  int xx;
  char *y;
  int * num;
  struct x *next;
}x;

您引用了一个在您使用的任何地方都没有定义的“结构标签” struct x。你没有办法引用变量的类型x。既然你想引用它,struct x你必须定义结构标签。

于 2009-11-06T14:46:21.613 回答
0

我认为这是您的结构在完全定义之前引用自身的事实。

特别是,您的结构没有名称;“x”是具有这种结构的变量的名称,但没有类型名称。

只需声明“ struct x { ... } x”就可以了。

于 2009-11-06T14:48:26.073 回答
0

请注意,void main()它从来都不是mainC 或 C++ 中的有效原型。

如果要指向要在struct中声明的struct,则需要标记structtypedef有时有用,但不是必需的。

请研究您的代码与以下代码之间的差异,并理解为什么存在差异。这将帮助你学习。阅读C 常见问题列表(例如,请参阅结构、联合和枚举)也是如此。

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

int main(void) {
    int b = 10;

    typedef struct x_struct {
        int xx;
        char *y;
        int *num;
        struct x_struct *next;
    } x;

    x *temp = malloc(sizeof(*temp));
    if ( !temp ) {
        return EXIT_FAILURE;
    }

    temp->num = &b;
    temp->next = temp;

    printf("%d %d\n", *(temp->num), *(temp->next->num));
    return 0;
}
于 2009-11-06T15:01:09.543 回答