[英]Realloc is messing up the code
我編寫了一個程序,該程序應該在文件內進行查找和替換,但條件是新單詞必須長於舊單詞。 我遇到了很多問題,例如打印怪異的字符或將內核轉儲,但是當我刪除realloc
語句時,問題似乎消失了。 我對該功能不是很熟悉,我犯了什么錯誤?
另外,我的空閑時間應該在哪里嗎?
void replace_word(const char *s, const char *old_word, const char *new_word){
char *buffer = malloc(BUFFER_SIZE);
char *init = buffer;
FILE *original_file;
FILE *copy;
if((original_file = fopen(s, "r")) == NULL){
perror(s);
exit(EXIT_FAILURE);
}
if((copy = fopen("copy.txt", "w")) == NULL){
perror("text");
exit(EXIT_FAILURE);
}
int old_word_len = strlen(old_word);
int new_word_len = strlen(new_word);
char *src;
char *dst;
char *tmp;
while(fgets(buffer, BUFFER_SIZE, original_file)){
if((tmp = strstr(buffer, old_word))){
buffer = realloc(buffer, BUFFER_SIZE + new_word_len - old_word_len);
src = tmp + old_word_len;
dst = tmp + new_word_len;
memmove(dst, src, strlen(src));
memcpy(tmp, new_word, new_word_len);
buffer = init;
}
fprintf(copy, "%s", buffer);
if(!strchr(buffer, '\n')){
fseek(original_file, -old_word_len, SEEK_CUR);
}
free(buffer);
buffer = malloc(BUFFER_SIZE);
}
free(buffer);
}
realloc
使用指向動態分配內存的指針,並調整內存塊的大小。 缺乏動態內存經驗的人們經常會忘記的一個重要點是, realloc
返回的指針可能與傳入的指針不同(通常不是)。 通常,堆沒有足夠的連續內存來執行請求的擴展,因此堆會找到足夠大的新內存塊來容納它並復制以前的內容。
關於代碼的第一件事是,您執行了不安全的realloc
:
buffer = realloc(buffer, BUFFER_SIZE + new_word_len - old_word_len);
通過指定一個指向其自身realloc
,你運行在OS無法完成分配和返回的風險NULL
。 如果發生這種情況,則您將丟失指向舊內存的指針,並且手上將發生內存泄漏。 要正確realloc
(和我猜你需要做到這一點反正來解決我的下一個點),分配的結果realloc
一個不同的指針,確認它不是NULL
,然后覆蓋指針。
但是我認為您的代碼的主要問題在於:
buffer = init;
如果我理解正確,則此語句的目的是將buffer
返回到字符串的開頭。 但是, init
指向的內存已由realloc
釋放,您最終取消引用了懸空指針。 您需要存儲對realloc
返回的新內存的開頭的引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.