【问题标题】:Question regarding de-referencing structure pointers关于取消引用结构指针的问题
【发布时间】:2009-11-06 14:42:42
【问题描述】:

我正在编译这段代码,但出现编译错误,提示“取消引用指向不完整类型的指针”。 我得到了最后一个打印语句的错误,在此之前我尝试指向 (*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);

}

【问题讨论】:

  • main() 返回一个整数。要使您的程序更便携,请使用int main(void) { /* ... */ }。而且你不需要转换malloc()的返回值,#include <stdlib.h>要好得多。而(*temp).num可以写成temp->num
  • 哦......你的printf除了格式字符串之外还需要1个参数,你传递了2个。
  • 你不应该在 C 中强制转换 malloc() 的返回值。
  • 感谢您的回答和 cmets。为了绝对清楚,我知道我没有为结构分配“标签”或“类型”,而只是声明了一个名为 x 的“变量”或“实例”。因此,无论何时,我都会使用 struct x,因为没有名为 x 的“类型/标签”,所以会让人感到困惑。当“int”本身没有定义时,它就像 int * 一样。我的想法正确吗?所以我看待它的方式是,我所做的只是获取一个名为“x”的特殊类型的变量,通过它我可以访问一个 int、一个 char *、一个 int * 和一个未知指针。这也正确吗?谢谢你的耐心

标签: c pointers structure dereference


【解决方案1】:

问题在于声明:

struct {
   ...
} x;

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

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

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

struct x {
   ...
};

【讨论】:

  • 这没有定义命名类型'x' - 它只是一个结构标记。要定义一个命名类型,你需要一个 typedef。
  • @Draemon - 部分正确 - 它定义了一个名为“x”的结构......在直接 C 中,如果没有“struct”部分,您不能使用“x”,但它仍然被命名为与 OP 相反当它未命名时。
  • @Aaron:它定义了一个名为“struct x”的结构,而不是一个名为“x”的结构的类型。在 C 中,结构标签和类型名称是不同的命名空间。
【解决方案2】:

我想你的意思是:

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

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

【讨论】:

    【解决方案3】:

    我认为这是因为您的结构在完全定义之前引用了它自己。

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

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

    【讨论】:

      【解决方案4】:

      除了 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);
      }
      

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

      【讨论】:

        【解决方案5】:

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

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

        请研究您的代码与以下代码之间的差异,并了解存在差异的原因。这将帮助你学习。阅读C FAQ list 也是如此(例如,参见Structures, Unions, and Enumerations

        #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;
        }
        

        【讨论】:

        • 嗨,在您的代码中,您是否想说 x_struct * temp = malloc .. 而不是 x *temp = malloc... 请澄清。另外,如果您可以查看我在顶部(针对问题)添加的评论,总结了我的理解。如果您能快速浏览一下,将非常感谢。
        • 我的意思是x *temp = malloc(...)struct x *temp 也可以。但是,既然我们已经对它进行了类型定义,为什么不使用 typedef 呢?
        猜你喜欢
        • 1970-01-01
        • 2011-02-04
        • 2013-01-04
        • 1970-01-01
        • 2013-07-04
        • 2017-11-03
        • 2017-06-17
        • 1970-01-01
        • 2021-11-23
        相关资源
        最近更新 更多