簡體   English   中英

重新分配弄亂了代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM