关于不兼容的指针类型的警告
我不理解对我的代码的警告。这似乎很简单,但我简单不明白。这是有问题的代码:关于不兼容的指针类型的警告
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是相同的类型。我错过了什么?感谢你们。
将两个已声明指向不同类型的指针等同时,会出现不兼容的警告类型。这是允许的,因为也许你作为编码人员知道它会起作用,但通常不会,这就是为什么你会收到警告。
在您的代码,您已经定义了结构的end
字段设置为1x1的字符数组其类型为char *
,但在你的第一个片段,你想用chunk *
等同起来。从您的代码看起来,您可能的意思是使用next
而不是end
。
此外,我强烈劝阻使用指针添加整数,除非您完全确定自己在做什么。即使如此,也许有更安全,更好的方法来实现你想要的任何事情。
此外,为什么你创建一个单个元素的字符数组?这对我来说似乎很奇怪。
它是一个pre-c99 pre gnu struct hack – 2014-09-28 04:24:00
这是不允许的,这是违反约束的。编译器必须投诉并可能拒绝编译。该转换需要强制转换。指针算术有什么问题? – mafso 2014-09-28 11:58:56
我想实现malloc函数,用链表管理可用(空闲)内存。用户需要一些内存,但我的块大于要求的内存。所以在这段代码中,我试图将这个节点分成两部分。我不知道这个解释是否清楚。我只是希望进一步提供新的节点,所以我可以分解它。但我得到了你所说的,谢谢你的回应。 char end [1]只是为了标记元数据的末尾(它在实际的内存分配之前)。 – 2014-09-28 20:02:24
'newNode'和'ptr'属于同一类型,但'ptr-> end + size'(与'ptr-> end'类型相同)是'char *'类型。 – mafso 2014-09-28 12:44:12