gpt4 book ai didi

c - 调用 strtok() 后释放内存导致错误

转载 作者:太空狗 更新时间:2023-10-29 15:26:06 25 4
gpt4 key购买 nike

你能帮帮我吗?我的代码进行标记化,所以我创建了这样的代码:

  1. 我分配一些内存,
  2. strcpy(malloced_memory, argv)
  3. 我执行 strtok(mallocted_memory, ".")
  4. 尝试free(mallocted_memory)

    filename = malloc(strlen(argv));

    strcpy(filename, argv);
    strk_ptr = malloc(sizeof(filename));
    strk_ptr = strtok(filename,".");//
    i++;
    sprintf(in->file_name,"%s",strk_ptr);

    while(strk_ptr = strtok(NULL,"."))//
    {
    i++;
    sprintf(in->file_name,"%s.%s",in->file_name,strk_ptr);
    sprintf(in->file_ext ,"%s",strk_ptr);
    }
    free(strk_ptr);
    free(filename);

该代码存在我无法free(filename) 的问题。如果我尝试 free(filename),程序就会得到 SIGTRAP。但程序正在运行。

我想解决这个问题。我该怎么办?

最佳答案

这一行:

filename = malloc(sizeof(argv));

应该是这样的:

filename = malloc(strlen(argv) + 1);     /* +1 for the '\0' at the end */
if (filename == NULL) { /* take some action */ }

还有这一行:

strk_ptr = malloc(sizeof(filename));

只是造成内存泄漏,因为它后面是:

strk_ptr = strtok(filename,".");

你应该检查返回值:

strk_ptr = strtok(filename,".");
if (strk_ptr == NULL) { /* take some action */ }

顺便说一句,strtok() 函数返回一个指向标记的指针,该标记位于初始调用中传递给它的字符串中(在您的示例中为 filename)。它不分配内存,所以它的返回值不应该被释放(你的程序避免了,但这是一个常见的错误)。当我提示 strtok() 时,我会提到您不能(直接或间接)将文字字符串传递给它以进行标记化,因为它会修改字符串并且文字字符串是只读的。也就是说,执行:strtok("sample.txt", ".") 是不行的。

最后,这种隐式条件不是很好的形式:

while (strk_ptr = strtok(NULL,".")) { ... }

更好的是:

while ((strk_ptr = strtok(NULL,".")) != NULL) { ... }

关于c - 调用 strtok() 后释放内存导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34761947/

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