【问题标题】:Pointer typecasting in cc中的指针类型转换
【发布时间】:2013-11-23 21:05:15
【问题描述】:

我正在用 C 语言编写图形的实现。我遇到了一种情况,我无法弄清楚编译器出现指针类型转换警告的行为方式的原因。 这是结构;

#define MAXV 10 
typedef struct {
    int y;
    int weight;
    struct edgenode *next;
} edgenode;


typedef struct {
   edgenode *edge[MAXV+1];
   int degree[MAXV+1];
   // other info of graph
} graph;

// operation in some other function
p->next = g->edge[x];

当我执行这种操作时,我收到了一个指针类型转换警告[默认启用]。

即使在尝试对所有可能的演员进行类型转换后,我也无法删除此警告。
最后我对结构进行了代码更改,突然警告消失了。 结构代码更改是这样的:-

typedef struct edgenode {   // note that I have added structure name here
    // same as above definition
} edgenode;

// operation in some other function
p->next = g->edge[x];

现在警告消失了,代码运行时没有任何警告。

我不明白为什么会发生这种情况;有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: c pointers casting


    【解决方案1】:

    问题出在这里:

    typedef struct {
        int y;
        int weight;
        struct edgenode *next;
    } edgenode;
    

    不清楚struct edgenode *next; 指的是什么类型(没关系;在某个地方,大概定义了struct edgenode),但不是这个结构,因为它没有标签。你需要:

    typedef struct edgenode
    {
        int y;
        int weight;
        struct edgenode *next;
    } edgenode;
    

    现在指针指向另一个相同类型的结构。因此,您找到的解决方案是解决您的问题的正确解决方案。

    记住:typedef 是现有类型的别名(替代名称)。您创建了类型名称 edgenode,但尚未定义类型 struct edgenode。在创建指向它的指针之前,您不必完全定义结构类型;这可能是创建“不透明类型”的好方法。

    另一种定义事物的方式是:

    typedef struct edgenode edgenode;
    
    struct edgenode
    {
        int y;
        int weight;
        edgenode *next;
    };
    

    这表示类型名称edgenodestruct edgenode 的别名;然后结构定义告诉编译器struct edgenode 的样子。

    【讨论】:

    • 但是在我执行那个操作之前我没有收到警告。我认为编译器应该在第一次看到结构定义本身中的struct edgenode *next; 时发出警告,为什么我得到仅在遇到下面代码中的操作时才发出警告。
    • 否:编译器不能。编写你所做的代码是完全合法的——即使它显然不是你想要的。您可以在其中有一个struct pokemon *next;,而无需在标题中进一步提及struct pokemon。它会编译好;只有当您尝试使用结构成员时才会遇到问题。
    • “在某个地方,大概定义了一个 struct edgenode”——不,struct edgenode 是一个不完整的类型,除非在引用时该类型需要完整,否则它不会收到警告,如此处所示。
    猜你喜欢
    • 2020-11-17
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2014-08-14
    相关资源
    最近更新 更多