簡體   English   中英

C - 又一個strtok()和free()問題

[英]C - Yet another strtok() and free() issue

我試圖了解如何在調用strtok()之后完全釋放內存。 我在這里閱讀了大部分已回答的問題,似乎沒有一個問題能解決我的困惑。 如果這是一個副本,請隨時指出我回答我的問題的方向

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char * aliteral = "Hello/world/fine/you";

    char * allocatedstring;

    char * token;
    int i=0;


    allocatedstring=(char *) malloc(sizeof(allocatedstring)*21);
    allocatedstring=strcpy(allocatedstring,aliteral);

    token = strtok(allocatedstring, "/");
    token = strtok(NULL, "/");
    token = strtok(NULL, "/");
    token = strtok(NULL, "/");



    printf("%s\n",allocatedstring);
    printf("%s\n",token);

    free(allocatedstring);


    return 0;
}

在這里釋放allocatedstring只會將字符串釋放到替換strtok分隔符的第一個\\0字符。 所以它只會在“你好”之前清除。 我檢查了使用eclipse調試器並監視內存地址。

我如何清除剩下的部分? 我嘗試了兩件事,有一個額外的指針指向allocatestring的開始並釋放(沒有工作)並在調用strtok()之后釋放令牌(也沒有工作)

那么如何清理現在在\\0之間的allocatedstring部分呢?

編輯:為了澄清,看到eclipse調試器中的內存地址塊,我在最初通過調用malloc分配的內存塊中看到字符串“HELLO WORLD FINE YOU”。 在調用free() ,包含“HELLO”和第一個\\0的塊變為亂碼,但其余的塊保持字符“FINE YOU”。 我認為這意味着他們沒有被釋放。

free不知道\\0終止字符串。

free將釋放malloc分配的內容,並且應該在這種情況下正常工作。

如果你的free證據不足僅僅是字符串數據仍然存在,那么你就會free誤解。
零出內存。 它只是將其標記為可供使用。
原始數據保留在該內存中。 但是內存可能由malloc的下一個調用者分配,並且調用者將能夠隨意覆蓋您的數據,因為您不再擁有該數據!

如果你想要的內存中清除(例如,如果它包含一個密碼或安全密鑰), 必須像清除出來memset ,你叫自由之前。

同樣,free僅將內存標記為“未分配,可供malloc使用”,並且不會清除內容。

PS某些調試系統(如Visual Studio)將覆蓋釋放的數據,但僅在調試器中顯示它已被釋放。 在C中合同不需要這種行為,只能幫助調試。 通常,釋放的內存可能會填充0xdeadbeef東西。

你在這一行上有一個小問題:

allocatedstring=(char *) malloc(sizeof(allocatedstring)*21);

sizeof(allocatedstring)等於sizeof (char *) ; 你分配足夠的空間21個指針char ,而不是21個字符。 這不是問題,因為char * 至少char一樣大,但是表明你正在處理什么類型的混淆。

也就是說,您不必擔心allocatedstring *allocatedstring的大小; 由於您正在分配足夠的空間來容納文字,因此您可以執行以下操作:

allocatedstring = malloc( strlen( aliteral ) + 1 ); // note no cast

至於你所看到的行為......

free 釋放與關聯的所有存儲器allocatedstring ; 你檢查時部分內存還沒有被覆蓋的事實並不令人驚訝,因為free不影響內存的內容 ; 它將包含最后寫入的內容,直到其他內容分配並使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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