Ошибка повреждения кучи при попытке освободить двумерный массив
Моя программа получает двумерный массив строк. После того, как он делает то, что должен, я пытаюсь освободить память, выделенную для строк, но я получаю ошибку повреждения кучи, когда пытаюсь это сделать. Вот мой код:
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 ответа
Есть несколько проблем:
Вы не выделяете достаточно памяти для строк. Как сказал Weather Vane, строка C заканчивается на ноль, вам нужно учесть это "0" и выделять еще один байт каждый раз, когда вы выделяете место для строки символов.
Не использовать
strcpy()
ноstrncpy()
вместо. Это из-за проблем безопасности. См. Почему вы должны использовать strncpy вместо strcpy?По тем же причинам не используйте
gets()
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);