关于不兼容的指针类型的警告

问题描述:

我不理解对我的代码的警告。这似乎很简单,但我简单不明白。这是有问题的代码:关于不兼容的指针类型的警告

chunk* findChunk(chunk *ptr, int size) 
{ 
    ... 
    chunk *newNode = ptr->end + size; 
    ... 
} 

块是我刚才所定义的结构:

typedef struct chunk 
{ 
    int size; 
    int available; 
    struct chunk* next; 
    char end[1]; 
} chunk; 

这是警告我收到:

warning: initialization from incompatible pointer type [enabled by default]<br> 
chunk *newNode = ptr->end + size; 

我不能我明白,newNode和ptr是相同的类型。我错过了什么?感谢你们。

+0

'newNode'和'ptr'属于同一类型,但'ptr-> end + size'(与'ptr-> end'类型相同)是'char *'类型。 – mafso 2014-09-28 12:44:12

将两个已声明指向不同类型的指针等同时,会出现不兼容的警告类型。这是允许的,因为也许你作为编码人员知道它会起作用,但通常不会,这就是为什么你会收到警告。

在您的代码,您已经定义了结构的end字段设置为1x1的字符数组其类型为char *,但在你的第一个片段,你想用chunk *等同起来。从您的代码看起来,您可能的意思是使用next而不是end

此外,我强烈劝阻使用指针添加整数,除非您完全确定自己在做什么。即使如此,也许有更安全,更好的方法来实现你想要的任何事情。

此外,为什么你创建一个单个元素的字符数组?这对我来说似乎很奇怪。

+2

它是一个pre-c99 pre gnu struct hack – 2014-09-28 04:24:00

+0

这是不允许的,这是违反约束的。编译器必须投诉并可能拒绝编译。该转换需要强制转换。指针算术有什么问题? – mafso 2014-09-28 11:58:56

+0

我想实现malloc函数,用链表管理可用(空闲)内存。用户需要一些内存,但我的块大于要求的内存。所以在这段代码中,我试图将这个节点分成两部分。我不知道这个解释是否清楚。我只是希望进一步提供新的节点,所以我可以分解它。但我得到了你所说的,谢谢你的回应。 char end [1]只是为了标记元数据的末尾(它在实际的内存分配之前)。 – 2014-09-28 20:02:24