Ошибка повреждения кучи при попытке освободить двумерный массив

Моя программа получает двумерный массив строк. После того, как он делает то, что должен, я пытаюсь освободить память, выделенную для строк, но я получаю ошибку повреждения кучи, когда пытаюсь это сделать. Вот мой код:

printf("Please enter the number of lines:");
        scanf("%d", &length);
        lines = (char**)malloc(length*sizeof(char*));//allocating memory for the array of strings "lines".
        if (lines == NULL)
        {
            printf("Error! Not enough memory.");
            return 0;
        }
        getchar();//needed in order to use "gets".
        printf("Please enter your lines:\n");
        for (i = 0; i < length; i++)
        {
            printf("%d.", i);
            gets(buffer);//user inserts the string "buffer".
            lines[i] = (char*)malloc(strlen(buffer)*sizeof(char));//allocating memory for the strings in the array according to the ength of the string "buffer".
            if (lines[i] == NULL)
            {
                printf("Error! Not enogh memory.");
                return 0;
            }
            strcpy(lines[i], buffer);//copies the string "buffer" into "lines[i]".
        }
        printf("Plese enter your comparison string:");
        text = (char*)malloc(80 * sizeof(char) + 1);//allocating temporary memory for the string "text".
        gets(text);//inserting the string "text".
        text = (char*)realloc(text, strlen(text)*sizeof(char)+1);//reallocating the correct memory of "text" according to its exact length and adding an additional memory spot for the chat "\0".
        cmpresult = isEquivalent(lines, length, text);//calling the function
        if (cmpresult == TRUE)//if the function returned TRUE
            printf("The strings are equal.\n\n");
        else printf("The strings are not equal.\n\n");//if the function returned FALSE.
        for ( i = 0; i < length; i++)//free the memory allocated for lines[i].
            free(lines[i]);
        free(lines);//free the memory allocated for the array "lines".
        getchar(option);
    }

После отладки я обнаружил, что это строка, которая приводит к сбою моей программы.

for (i=0; i < length; i++)//free the memory allocated for lines[i].
 free(lines[i]);

Я должен через день, и я в отчаянии! Спасибо.

2 ответа

Есть несколько проблем:

  1. Вы не выделяете достаточно памяти для строк. Как сказал Weather Vane, строка C заканчивается на ноль, вам нужно учесть это "0" и выделять еще один байт каждый раз, когда вы выделяете место для строки символов.

  2. Не использовать strcpy() но strncpy() вместо. Это из-за проблем безопасности. См. Почему вы должны использовать strncpy вместо strcpy?

  3. По тем же причинам не используйте gets()

  4. text не освобождается (это ваша первоначальная проблема)

Переполнение происходит здесь для каждой строки:

gets(buffer);
lines[i] = (char*)malloc(strlen(buffer)*sizeof(char));
if (lines[i] == NULL)
{
    printf("Error! Not enogh memory.");
    return 0;
}
strcpy(lines[i], buffer); // <----- overflow happens here

Чтобы исправить это изменение:

lines[i] = (char*)malloc(strlen(buffer)*sizeof(char));

чтобы:

lines[i] = (char*)malloc((strlen(buffer)+1)*sizeof(char));

realloc() в следующем коде не помогает с переполнением. К этому времени переполнение уже произошло (если оно произошло).

text = (char*)malloc(80 * sizeof(char) + 1);
gets(text); // <----- overflow happens here if string > 80
text = (char*)realloc(text, strlen(text)*sizeof(char)+1);
Другие вопросы по тегам