Почему код останавливает и прерывает выполнение с указателем? - PullRequest
0 голосов
/ 29 сентября 2018

Мне нужно выделить память для структуры, называемой Locadoras, и во время выполнения она говорит /dorun.sh: строка 71: 2692 Прервано (ядро сброшено) sh "$ {SHFILE}".Я пробовал в Netbeans и Codeblocks, та же ошибка в C. Вот коды:

Main.c

Locadoras *filmes;
filmes = malloc(sizeof (Locadoras));
LerArquivoBinarioFilmes(filmes);

TransacoesFilmes.c

void LerArquivoBinarioFilmes(Locadoras *filme) {
    FILE * arq;
    arq = fopen("DadosLocadora.bin", "rb");
    int cont = 1;
    if (arq != NULL) {
        while (1) {
            size_t tam = fread(filme, sizeof (Locadoras), 1, arq);
            if (tam < 1) {
                break;
            }
            cont++;
            realloc(filme, sizeof (Locadoras) * cont);
        }
    } else {
        printf("error");
        exit(1);
    }
    fclose(arq);
}

1 Ответ

0 голосов
/ 29 сентября 2018

относительно:

realloc(filme, sizeof (Locadoras) * cont);

Функция realloc возвращает (при успешном выполнении) указатель на вновь выделенную память и скопировала содержимое предыдущей памяти во вновь выделенную память.Однако, это может потерпеть неудачу.В случае неудачи он возвращает указатель NULL

  1. , код должен сначала проверить (! = NULL) возвращаемое значение, чтобы убедиться, что операция прошла успешно
  2. только тогда, когда realloc успешноБезопасно ли назначать целевой указатель из возвращаемого значения

В качестве примера

void *temp = realloc(filme, sizeof (Locadoras) cont);
if( !temp )
{
    perror( "realloc failed" );
    free( filme );
    exit( EXIT_FAILURE );
}

// implied else, realloc successful

filme = temp;

Примечание:

  1. free() находится вstdlib.h
  2. perror() найдено в stdio.h
  3. exit() найдено в stdlib.h
  4. EXIT_FAILURE найдено в stdlib.h
...