을 사용하여 할당 된 char *
에서 작동하는 C에서 문자열 바꾸기 함수를 작성하려고했습니다. 시작 문자열에있는 문자가 아니라 문자열을 찾아서 바꿀 수 있다는 점에서 조금 다릅니다.realloc()에 이중 자유 오류가 발생하는 이유는 무엇입니까?
충분한 공간이 할당되어 있기 때문에 검색 및 바꾸기 문자열이 동일한 길이 (또는 바꾸기 문자열이 검색 문자열보다 짧으면)하는 것이 쉽습니다. realloc()
을 사용하려고하면 double free를 수행하고 있음을 알리는 오류가 발생합니다. realloc()
만 사용하고 있기 때문에 나는 어떻게 보이지 않습니다.
void strrep(char *input, char *search, char *replace) {
int searchLen = strlen(search);
int replaceLen = strlen(replace);
int delta = replaceLen - searchLen;
char *find = input;
while (find = strstr(find, search)) {
if (delta > 0) {
realloc(input, strlen(input) + delta);
find = strstr(input, search);
}
memmove(find + replaceLen, find + searchLen, strlen(input) - (find - input));
memmove(find, replace, replaceLen);
}
}
이 프로그램은 작동, 나는 대체 문자열이 초기 문자열보다 더 길어질 수 인스턴스에 realloc()
하려고 할 때까지. (그것은 여전히 일종의 작품이며, 결과뿐만 아니라 오류도 뱉어냅니다.) 도움이된다면
는 호출 코드가 보이는 같은 :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void strrep(char *input, char *search, char *replace);
int main(void) {
char *input = malloc(81);
while ((fgets(input, 81, stdin)) != NULL) {
strrep(input, "Noel", "Christmas");
}
}
realloc이 실패하면 NULL을 반환하고 기존 버퍼를 그대로 둡니다. 방금 포인터를 잃어 버렸습니다 : :-( –