指针类型转换为c

时间:2013-11-23 21:05:15

标签: c pointers casting

我正在用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];

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

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

1 个答案:

答案 0 :(得分:3)

问题在于:

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是什么样的。