Обнаружено повреждение кучи после нормального блока (# 174)

я знаю, что этот вопрос был задан, но я не смог исправить программу

  void swap1(char*str1,char*str2)
{
char *ezer =new char[strlen(str1)];
for (int i = 0 ; i <= strlen(str1);i++)
ezer[i]=str1[i];
delete [] str1;
str1= new char[strlen(str2)];
for (int i = 0 ; i <= strlen(str2);i++)
str1[i]=str2[i];
delete [] str2;
str2= new char[strlen(ezer)];
for (int i = 0 ; i <= strlen(ezer);i++)
str2[i]=ezer[i];
delete[] ezer;
}

один раз в первый раз, когда это работает летучая мышь во 2 (с другим значением) раз я получаю ошибку
ошибка пришла в последней строке delete[] ezer; почему я не могу удалить ezer?

Ошибка:

heap corruption detected after normal block (#174) at 0x007D7A48
CRT detected that the application wrote to memory end of heap buffer

3

Решение

strlen не считает нулевой терминатор в конце ваших строк. Это означает, что после одного применения вашей функции подкачки две строки будут поменяны местами, но больше не будут обнуляться. Поведение strlen для строки без нулевого терминатора не определено, что означает, что вы пересекаете границы выделенной кучи при прохождении одной из этих зарезанных строк.

Строки в C представлены в виде символьного указателя с нулевым байтом, указывающим конец строки (нулевой терминатор, который я упомянул). Любая библиотечная подпрограмма, которая работает со «строками», ожидает, что ей будет предоставлен символьный массив с концом, отмеченным нулем, и в противном случае будет иметь неопределенное поведение (так как вы бы предоставили массив символов, а не строку в этой точке).

Используйте библиотечную функцию strcpy вместо собственной.

Увидеть этот вопрос для деталей.

5

Другие решения

Вам не хватает места для 0-терминатора здесь:

char *ezer = new char[strlen(str1)];

Измените это на:

char *ezer = new char[strlen(str1) + 1];

Фактическое (первое) повреждение памяти происходит здесь:

  for (int i = 0 ; i <= strlen(str1);i++)
ezer[i]=str1[i];

Как и в последней итерации (той, которая копирует 0-терминатор) ezer[i] ссылается на память «только позади», что было выделено для ezer,

Повторите то же самое для двух других распределений символов arrayc.

В любом случае, поскольку это исправит повреждение кучи, функция будет работать не так, как ожидалось. Но это другая история … не так ли? 😉

0

По вопросам рекламы [email protected]