gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:54:56 26 4
gpt4 key购买 nike

我想了解如何在调用 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 调试器并监视内存地址。

如何清除其余部分?我尝试了 2 件事,有 1 个额外的指针指向 allocatedstring 的开始并释放它(没有工作)并在调用 strtok() 后释放 token (也没有工作)

那么我该如何清理 allocatedstring 中现在位于 \0 之间的部分呢?

编辑: 为了澄清,在 eclipse 调试器中查看内存地址 block ,我在最初由调用 分配的内存块中看到字符串“HELLO WORLD FINE YOU”分配器。在调用 free() 之后,包含“HELLO”和第一个 \0 的 block 变成乱码,但其余 block 保留字符“FINE YOU” .我认为这意味着他们没有被释放。

最佳答案

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

free 将释放使用 malloc 分配的内容,并且在这种情况下应该可以正常工作。

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

如果你想清除内存(例如,如果它包含密码或安全 key ),必须在你之前用memset之类的东西清除它免费电话。

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

PS 某些调试系统(例如 Visual Studio)会覆盖已释放的数据,但只是为了在调试器中明显表明它已被释放。这种行为在 C 中不是契约(Contract)上需要的,它只是有助于调试。通常,释放的内存可能会填充类似 0xdeadbeef 的内容。

关于C - 另一个 strtok() 和 free() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22310840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com