Mallo c не выделяет достаточную память - PullRequest
0 голосов
/ 18 марта 2020

При запуске кода я проверяю, выделен ли указатель достаточной памяти или он остается равным NULL, но ему может быть назначено все количество памяти, которое мы хотели. Мы используем C11 с Clion.

Первая часть кода:

#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:

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);
    ...
    ...

arg c является целым числом со значением 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("%d\n", 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 {
    ...
    ...

1 Ответ

1 голос
/ 19 марта 2020

sizeof не говорит вам, сколько памяти было выделено. Там нет стандартного способа узнать это. С malloc() вы либо получаете по крайней мере запрашиваемое количество байтов, либо получаете NULL. sizeof(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);

Значение меньше 0 для num_categorias создает проблемы. Рассмотрим тип unsigned .

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

Значение для num_categorias создает проблемы. Некоторые старые системы возвращают NULL даже в случае успеха.

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