BuckvicK
@BuckvicK
Опытный ламер

Как правильно очистить память?

void separator_clean(char** text, char* separator){
	int i = 0, j = 0, check = 0, k = 0;
	char *str, *buffer;
	while (i<STR){
		str = (char*)malloc(sizeof(char));
		*str = '\0';
		buffer = (char*)malloc(sizeof(char));
		*buffer = '\0';
		strcpy(str, *(text+i));
		j = 0;
		check = 0;
		while (*(str+j) != '\0'){
			buffer = (char*)malloc(sizeof(char));
			*buffer = '\0';
			if (strchr(separator, *(str+j)) != NULL){
				check++;
			}
			else {check = 0;}

			if ((check > 1)){
				*(str + j - 1) = *separator;
				strncat(buffer, str, j);
				printf("#BUF:%s\n", buffer);
				strcat(buffer, str + j+1);
				printf("#BU2:%s\n", buffer);
				strcpy(str, buffer);
				printf("#STR:%s\n", str);
				k = 0;
				j--;
			}
			j++;
			//free(buffer);
		}
		strcpy(*(text + i), str);
		printf("STR:%s\n", str);
		printf("TEX:%s\n", *(text+i));
		printf("BUF:%s\n", buffer);
		i++;
		//free(str);
	}
}

Функция получает массив текста(text), и массив разделителей(separator). Выполняет операции построчно, через str.
Она заменяет несколько подряд идущих разделителей на первый в массиве разделителей. Работает правильно, но возникает проблема с памятью, если строка достаточно длинная. При освобождении памяти(закоментированные строчки), программа выдает ошибку: "Has triggered a breakpoint.".
Объясните в чем проблема?
  • Вопрос задан
  • 293 просмотра
Решения вопроса 1
@MiiNiPaa
buffer = (char*)malloc(sizeof(char));Выделяет память для хранения одного символа.
Пишется туда больше одного символа, получаем классическое переполнение буфера, которое очевидно повреждает какую-то информацию необходимую для корректного удаления.
+ буфер созданый на строке 7 никогда не освобождается

И чем вам strspn/strcspn не угодили?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 02:56
10000 руб./за проект
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект