警告:赋值使用整数而不使用强制转换

我正在从指针执行转换然后它让我运行此警告(赋值使得指针来自整数而没有强制转换)。 这是代码:

#include #include typedef int TipoChave; typedef struct TipoRegistro { TipoChave Chave; /*outros componentes*/ } TipoRegistro; typedef struct TipoPagina* TipoApontador; typedef struct TipoPagina { int registros; TipoRegistro *r; TipoApontador *p; } TipoPagina; TipoApontador NovaSubArvore(int ordem){ TipoApontador A; A=malloc(sizeof(TipoPagina)); int i; A->registros=0; A->r=malloc((2*ordem)*sizeof(TipoRegistro)); A->p=malloc((2*ordem+1)*sizeof(TipoPagina)); for (i=0;ip[i]=NULL; if(i!=2*ordem){ A->r[i].Chave=0; } } return (A); } 

在主要我打电话:

 TipoApontador Raiz; 

然后:

 Raiz=NovaSubArvore(ordem); //Warning happens here 

如果我做:

 if (Raiz!=NULL) free(Raiz); 

它运行一个免费的invallid(奇怪,因为如果Raiz是NULL,免费应该没有运行。请问有人帮我解决这个问题吗?我认为这个警告是让我免于“解放”的问题。

编辑:关于waring解决的确定问题。 但是,如果我做了2次免费运行,它运行一个无效的免费(我有一个免费的东西,其他时间没有。如果我做免费的“如果(Raiz!= NULL)”应该阻止其他免费跑步。但事实并非如此。

一个问题是对malloc()的调用以及你没有通过包含声明malloc()这一事实。

默认情况下,假定函数在C99之前的代码中返回一个int – 在C99代码中,您应该在使用它之前声明一个函数。

您需要使用更多警告选项进行编译。 如果您使用GCC,我建议:

 gcc -O3 -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \ -Wold-style-definition ... 

这几乎可以确保您没有使用未声明的函数(例如malloc() )。 根据您使用的GCC版本,默认情况下可能会启用更多或更少的警告。 一般来说,较新的版本比较简单,但并不那么简单。


另一个问题似乎是您有一个源文件(问题中没有给出名称),其中包含类型定义和函数定义,例如:

 typedef struct TipoPagina* TipoApontador; typedef struct TipoPagina { ... } TipoPagina; TipoApontador NovaSubArvore(int ordem) { ... } 

在此文件中,类型是已知的。 在您的主要代码中,您有:

 TipoApontador Raiz; ... Raiz = NovaSubArvore(ordem); //Warning happens here 

必须在此文件中知道类型名称TipoApontador ,但似乎您的代码不包含NovaSubArvore()的声明。

对于将在多个源文件中使用的类型和函数,应该有一个标头定义类型并声明函数。 标头应该在定义函数的源文件和使用类型和函数的源文件中使用。

例如,标题可能是tipopagina.h

 #ifndef TIPOPAGINA_H_INCLUDED #define TIPOPAGINA_H_INCLUDED typedef int TipoChave; typedef struct TipoRegistro { TipoChave Chave; /*outros componentes*/ } TipoRegistro; typedef struct TipoPagina* TipoApontador; typedef struct TipoPagina { int registros; TipoRegistro *r; TipoApontador *p; } TipoPagina; extern TipoApontador NovaSubArvore(int ordem); #endif /* TIPOPAGINA_H_INCLUDED */ 

头部防护很重要; 它们避免了重新定义类型的问题(尽管C11在处理typedef的重新定义时比C99或C89更具灵活性)。 在函数名之前使用extern并不是绝对必要的,尽管我更喜欢看它 – 如果只是为了在标题中声明的任何变量之前必须存在的extern对称性(如果有的话 – 全局变量应该是尽可能避免)。

那么实现文件tipopagina.c可能会启动:

 #include "tipopagina.h" #include  TipoApontador NovaSubArvore(int ordem) { TipoApontador A = malloc(sizeof(TipoPagina)); ... return (A); } 

tipopagina.h标头放在第一位是有充分理由的; 它确保标题可以单独使用(这很重要)。

主代码还包括tipopagina.h ,并且因为函数NovaSubArvore()在头文件中声明,所以可以避免编译器警告。

代码看起来没问题,但如果我在定义NovaSubArvore之前放置main ,那么我看到完全相同的错误:

 int main() { TipoApontador Raiz; int ordem = 10 ; Raiz=NovaSubArvore(ordem); } TipoApontador NovaSubArvore(int ordem){ /// Rest of the function } 

所以在这种情况下,返回类型将默认为int 。 在K&R C中,如果您不使用该类型,它将默认为int

这看起来对我好。 你确定TipoApontadorNovaSubArvore的给定定义是main引用的吗? 您可能没有使用这些定义的方法是(例如):

  1. 包含与您粘贴的头文件不同的头文件(如果它们存在于.h文件中)
  2. 包括另一个头文件,它也定义了一个具有该名称的类型或函数,虽然在这种情况下我会期望一个警告
  3. TipoApontadoreNovaSubArvore实际上在main未声明,编译器正在分配默认类型。 (这似乎对我来说最有可能。如果是这种情况,你应该期待这种效果的警告。)

当然,这不是一个详尽的清单,但这些事情在我之前发生过。

编辑 :另外,你是否打开编译器的所有警告? 例如,如果您使用的是gcc,是否使用-Wall选项?

好吧….我认为不可能做到这样的事情:

 free (Raiz) if (Raiz!=NULL) free(Raiz); 

无论如何,这将无效免费。 其余的问题是由那里的一些答案解决的。 我接受了最完整的。 但感谢大家的帮助!