我试图了解如何在调用后完全释放内存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;
}
Run Code Online (Sandbox Code Playgroud)
allocatedstring在这里释放只会将字符串释放到\0替换strtok分隔符的第一个字符.所以它只会在"你好"之前清除.我检查了使用eclipse调试器并监视内存地址.
我如何清除剩下的部分?我尝试了两件事,有一个额外的指针指向allocatestring的开始并释放(没有工作)并在调用后释放令牌strtok()(也没有工作)
那么如何清理allocatedstring现在之间\0的部分呢?
编辑:为了澄清,看到eclipse调试器中的内存地址块,我在最初通过调用分配的内存块中看到字符串"HELLO WORLD FINE YOU" malloc.在调用之后free(),包含"HELLO"和第一个的块\0变成了乱码,但其余的块保留了字符"FINE YOU".我认为这意味着他们没有被释放.
free不知道\0终止字符串.
free将免费分配malloc,并在这种情况下应该正常工作.
如果您的证据free无效,只是字符串数据仍然存在,那么您就会误解free.
它不是零出内存.它只是将其标记为可供使用.
原始数据保留在该内存中.但是内存可能由下一个调用者分配malloc,并且调用者将能够随意覆盖您的数据,因为您不再拥有该数据!
如果你想要的内存中清除(例如,如果它包含一个密码或安全密钥),你必须像清除出来memset,你叫自由之前.
同样,free仅将内存标记为"未分配,可供malloc使用",并且不会清除内容.
PS某些调试系统(如Visual Studio)将覆盖释放的数据,但仅在调试器中显示它已被释放.在C中合同不需要这种行为,只能帮助调试.通常,释放的内存可能会填充类似的东西0xdeadbeef.