c-Malloc没有分配足够的内存



运行代码时,我会检查指针是否分配了足够的内存,或者它是否保持为NULL,但可以分配我们想要的全部内存。我们正在与Clion一起使用C11。

代码的第一部分:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "LS_allegro.h"
#define MAX_CHAR 100
typedef struct {
char name[MAX_CHAR];
char escuderia[MAX_CHAR];
int dorsal;
int reflejos;
int c_fisica;
int temperamento;
int gest_neumaticos;
}DatosPiloto;
typedef struct {
char type[26];
int vel;
int acc;
int cons;
int fiab;
}Pieza;
typedef struct {
char name_cat[26];
Pieza *pieza;
int num_piezas;
}Categorias;

内部主函数调用:

int main (int argc, char **argv) {
char sel[MAX_CHAR];
int opt = 0;
int error = 0, datosok = 0;
// Opcion 1
DatosPiloto datosPiloto;
Categorias *categorias;
if (argc == 5) {
error = abreFichero(argv);
}
else {
printf("Error. El programa tiene que recibir 4 argumentos.");
error = 1;
}

if (error == 0) {
leerArchivos(argv, &categorias);
...
...

argc是一个值始终为5的整数,**argv是clion中导入文件的指针,其中[0]是第一个文件,[4]是最后一个文件。

功能是:

void leerArchivos (char **argv, Categorias **categorias) {
FILE *Piezas;
FILE *GPs;
FILE *Corredores;
FILE *Base;
int num_categorias = 0, lineas_leer = 0;
int j = 0, i = 0, cat_count = 0;
char basura;
Piezas = fopen(argv[1], "r");
GPs = fopen(argv[2], "r");
Corredores = fopen(argv[3], "rb");
Base = fopen(argv[4], "rb");

fscanf(Piezas, "%d", &num_categorias);
printf("%dn", num_categorias);
*categorias = (Categorias *) malloc(num_categorias * sizeof(Categorias));
if (*categorias == NULL || sizeof(categorias) < num_categorias * sizeof(Categorias)) {
printf("ERROR! Memory not allocated or smaller that desired.n");
}else {
...
...

sizeof不会告诉您分配了多少内存。没有标准的方法可以找到答案。使用malloc(),您要么至少得到您要求的字节数,要么得到NULLsizeof(categorias)是指针的大小,无论是否分配了多少内存。@M Oehm

以下内容可以。

*categorias = (Categorias *) malloc(num_categorias * sizeof(Categorias));
if (*categorias == NULL) {
printf("ERROR! Memory not allocated or smaller that desired.n");
} else {

不需要铸造。

分配到引用数据的大小比类型的大小更干净。

*categorias = malloc(sizeof *categorias * num_categorias);

num_categorias的值小于0会产生问题。考虑一个无符号类型。

// int num_categorias = 0
unsigned  num_categorias = 0
// or 
size_t num_categorias = 0

num_categorias的值为会产生问题。一些较旧的系统即使成功也会返回NULL

if (*categorias == NULL && num_categorias != 0) {

相关内容

  • 没有找到相关文章

最新更新