Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 关于不兼容指针类型的警告_C_Pointers_Types_Warnings - Fatal编程技术网

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

C 关于不兼容指针类型的警告,c,pointers,types,warnings,C,Pointers,Types,Warnings,我不理解对我的代码的警告。看起来很简单,但我不明白。下面是一段有问题的代码: chunk* findChunk(chunk *ptr, int size) { ... chunk *newNode = ptr->end + size; ... } chunk是我之前定义的结构: typedef struct chunk { int size; int available; struct chunk* next; char end[1

我不理解对我的代码的警告。看起来很简单,但我不明白。下面是一段有问题的代码:

chunk* findChunk(chunk *ptr, int size)
{
    ...
    chunk *newNode = ptr->end + size;
    ...
}
chunk是我之前定义的结构:

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;
警告:从不兼容的指针类型初始化[默认启用]
chunk*newNode=ptr->end+size;

我无法理解,很明显newNode和ptr是同一类型的。我错过了什么?谢谢大家。

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

在代码中,您将结构的
end
字段定义为1x1字符数组,其类型为
char*
,但在第一个代码片段中,您试图将其等同于
chunk*
。从您的代码来看,您可能打算使用
next
而不是
end

此外,我强烈反对使用向指针添加整数,除非您完全确定自己在做什么。即使这样,也可能有更安全、更好的方法来实现你正在尝试的目标


还有,为什么要用一个元素创建一个char数组?这对我来说似乎很奇怪。

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

在代码中,您将结构的
end
字段定义为1x1字符数组,其类型为
char*
,但在第一个代码片段中,您试图将其等同于
chunk*
。从您的代码来看,您可能打算使用
next
而不是
end

此外,我强烈反对使用向指针添加整数,除非您完全确定自己在做什么。即使这样,也可能有更安全、更好的方法来实现你正在尝试的目标


还有,为什么要用一个元素创建一个char数组?这对我来说似乎很奇怪。

这是c99之前的gnu结构hack,这是不允许的,这违反了约束。编译器必须抱怨,并可能拒绝编译。转换需要强制转换。指针算法有什么问题?我正在尝试实现malloc函数,用链表管理可用(空闲)内存。用户需要一些内存,但我的数据块比要求的内存大。在这段代码中,我试图将这个节点一分为二。我不知道这个解释是否清楚。我只想让这个新节点更进一步,这样我就可以拆分它了。但我明白你说的,谢谢你的回复。char end[1]只是用来标记元数据的结尾(它在要分配的实际内存之前)。@mafso,指针算法本身并没有什么问题,它只是危险的,而且不安全。在某些情况下,这种方法比其他方法更有效,但你必须格外小心。如果它不在关键循环中,那么为了提高可读性、可维护性和类型安全性,降低效率可能是值得的。至于允许使用不兼容的指针,我想我记得,可能是错误的,代码“工作”时指针类型不匹配。Gcc是相当宽容的。对于许多违反约束的情况,默认情况下它只给出警告而不是错误。这并不意味着你的代码是正确的C。算术不会改变类型,如果有,你必须警告一般的指针(但正如我所说的,它们是类型化的,在大多数情况下,你需要转换它们)。这是c99之前的gnu结构。这是不允许的,这是违反约束的。编译器必须抱怨,并可能拒绝编译。转换需要强制转换。指针算法有什么问题?我正在尝试实现malloc函数,用链表管理可用(空闲)内存。用户需要一些内存,但我的数据块比要求的内存大。在这段代码中,我试图将这个节点一分为二。我不知道这个解释是否清楚。我只想让这个新节点更进一步,这样我就可以拆分它了。但我明白你说的,谢谢你的回复。char end[1]只是用来标记元数据的结尾(它在要分配的实际内存之前)。@mafso,指针算法本身并没有什么问题,它只是危险的,而且不安全。在某些情况下,这种方法比其他方法更有效,但你必须格外小心。如果它不在关键循环中,那么为了提高可读性、可维护性和类型安全性,降低效率可能是值得的。至于允许使用不兼容的指针,我想我记得,可能是错误的,代码“工作”时指针类型不匹配。Gcc是相当宽容的。对于许多违反约束的情况,默认情况下它只给出警告而不是错误。这并不意味着你的代码是正确的C。算术不会改变类型,如果你需要警告指针的话(但正如我所说,它们是类型化的,在大多数情况下,你需要转换它们)。
newNode
ptr
是相同的类型,但是
ptr->end+size
(与
ptr->end
类型相同)为
char*
newNode
ptr
类型相同,但
ptr->end+size
(与
ptr->end
类型相同)为
char*
类型。