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