Как мне освободить память здесь? (С) - PullRequest
0 голосов
/ 02 января 2019

У меня очень быстрый вопрос. Почему я обнаруживаю повреждение кучи, когда пытаюсь освободить массив в функции void translateWord ()? Я попытался освободить строку за строкой в ​​цикле for, но, похоже, это не работает. Я думал, что если я использую эту функцию более одного раза, и каждый раз, когда функция выделяет память, я должен освободить ее в конце функции. Есть идеи?

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>


void translateWord(char word[], FILE *point_out, FILE *point_1)
{
    rewind(point_1);
    char ch;
    int gasit = 0;
    int lines = count_lines(point_1);
    int i = 0;
    char *cp;
    char *bp;
    char line[255];
    char **array = (char**)malloc(sizeof(char*)*2*lines);

    rewind(point_1);
    while (fgets(line, sizeof(line), point_1) != NULL) {
        bp = line;
        while (1) {
            cp = strtok(bp, "=\n");
            bp = NULL;

            if (cp == NULL)
                break;
            array[i] = (char*)malloc(sizeof(char)*strlen(cp));
            strcpy(array[i++], cp);
        }
    }

    gasit = cuvant_gasit(word, array, lines, point_out, gasit);
    if (gasit == 0)
    {
        fprintf(point_out, "<<%s>>", word);
    }

    for (int k = 0; k < 2 * lines; k++)
    {
        free(array[k]);
    }
    free(array);
}

1 Ответ

0 голосов
/ 02 января 2019

Что-то не так в translateWord :

array[i] = (char*)malloc(sizeof(char)*strlen(cp));
strcpy(array[i++], cp);

Первая строка должна быть array[i] = (char*)malloc(strlen(cp) + 1);, иначе 1 символ отсутствует для сохранения последнего нулевого символа во время strcpy .

Обратите внимание, что по определению sizeof(char) равно 1.

И почему вы не просто используете strdup вместо malloc , а затем strcpy ? просто замените эти 2 строки на array[i++] = strdup(cp);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...