C - 又一个strtok()和free()问题

ppl*_*lat 2 c free strtok

我试图了解如何在调用后完全释放内存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".我认为这意味着他们没有被释放.

abe*_*nky 6

free不知道\0终止字符串.

free将免费分配malloc,并在这种情况下应该正常工作.

如果您的证据free无效,只是字符串数据仍然存在,那么您就会误解free.
不是零出内存.它只是将其标记为可供使用.
原始数据保留在该内存中.但是内存可能由下一个调用者分配malloc,并且调用者将能够随意覆盖您的数据,因为您不再拥有该数据!

如果你想要的内存中清除(例如,如果它包含一个密码或安全密钥),必须像清除出来memset,你叫自由之前.

同样,free仅将内存标记为"未分配,可供malloc使用",并且不会清除内容.

PS某些调试系统(如Visual Studio)将覆盖释放的数据,但仅在调试器中显示它已被释放.在C中合同不需要这种行为,只能帮助调试.通常,释放的内存可能会填充类似的东西0xdeadbeef.