- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从一个指针进行强制转换,然后它让我一直运行此警告(赋值从整数生成指针而不进行强制转换)。这是代码:
#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/
我是一名优秀的程序员,十分优秀!