gpt4 book ai didi

c - 警告 : assignment makes pointer from integer without a cast

转载 作者:行者123 更新时间:2023-12-04 19:56:11 29 4
gpt4 key购买 nike

我正在从一个指针进行强制转换,然后它让我一直运行此警告(赋值从整数生成指针而不进行强制转换)。这是代码:

#include<stdio.h>
#include<stdbool.h>



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;i<(2*ordem+1);i++){
A->p[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);

它运行了一个无效的免费(奇怪,因为如果 Raiz 为 NULL,则免费不应该运行。任何人都可以帮我解决这个问题吗?我认为这个警告也是让我无法“释放”的问题。

编辑:关于 waring 的 OK 问题已解决。但是,如果我免费执行 2 次,它会运行无效的免费(我有一个功能可以免费执行某些操作,有时则不会。如果我免费执行“if(Raiz!= NULL)”应该阻止另一个免费运行。但它不是。

最佳答案

一个问题是调用 malloc()以及您尚未声明 malloc() 的事实通过包括 <stdlib.h> .

默认情况下,假定函数返回 int。在 C99 之前的代码中 — 在 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() 的声明.

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

例如, header 可能是 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 对称必须出现在 header 中声明的任何变量之前(如果有的话——应尽可能避免使用全局变量)。

然后是执行文件tipopagina.c可能开始:

#include "tipopagina.h"
#include <stdlib.h>

TipoApontador NovaSubArvore(int ordem)
{
TipoApontador A = malloc(sizeof(TipoPagina));
...
return (A);
}

有一个 good reason用于放置 tipopagina.h header 优先;它确保 header 可以单独使用(这很重要)。

主要代码还包括tipopagina.h , 因为函数 NovaSubArvore()在 header 中声明,您可以避免编译器警告。

关于c - 警告 : assignment makes pointer from integer without a cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15995449/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com