如何在C中正确使用strtok,以便没有内存泄漏?

use*_*392 11 c malloc free strtok

我对在C中的char指针上调用strtok时会发生什么感到有些困惑.我知道它会修改字符串的内容,所以如果我在名为'line'的变量上调用strtok,它的内容将会改变.假设我遵循以下方法:

void function myFunc(char* line) {

    // get a pointer to the original memory block
    char* garbageLine = line;

    // Do some work
    // Call strtok on 'line' multiple times until it returns NULL
    // Do more work

    free(garbageLine);
}
Run Code Online (Sandbox Code Playgroud)

进一步假设'line'在传递给myFunc之前被malloced.我应该在使用strtok之后释放原始字符串还是为我们完成工作?另外,如果'line'没有被malloced并且我尝试使用上面的函数会发生什么?取而代之的是更安全吗?(假设程序员知道该行未被malloced,则不会免费拨打电话)

调用

char* garbageLine = line;
myFunc(line);
free(garbageLine);
Run Code Online (Sandbox Code Playgroud)

功能定义

void function myFunc(char* line) {
    // Do some work
    // Call strtok on 'line' multiple times until it returns NULL
    // Do more work
}
Run Code Online (Sandbox Code Playgroud)

x-x*_*x-x 9

strtok()不会释放任何东西,因为它不知道字符串的存储位置.它可能在堆栈或堆上,它不知道或关心!:)

取而代之的是更安全吗?

你的第二个例子要好得多,因为它简化了myFunc(),并且在更多情况下使它很有用,因为函数不需要知道字符串的分配位置.通过从myFunc()中删除对free()的调用,您可以使用该函数来解析堆栈或堆中的字符串.调用者分配内存,调用者释放内存!

进一步阅读: strtok()


小智 6

值得解释的是,strtok它的工作原理是:

  1. 返回指向原始字符串的指针;和

  2. 将找到的每个分隔符替换为 NULL。

因此,一切就位,不需要分配任何内存。