与strtok一起使用的C自由变量

use*_*408 -3 c pointers strtok undefined-behavior invalid-pointer

我已经看到过类似的帖子,但是我发现了一些差异,使我误入歧途。

我有以下代码:

char * token_one = strtok(my_buffer, " ,.-");
char * token_two = strtok(NULL, " ,.-");

free(token_one);
free(token_two);
Run Code Online (Sandbox Code Playgroud)

我看到有人在帖子中说不应释放与strtok一起使用变量,但是为什么在执行此代码时却得到此信息:

free(token_one) 没有错误

free(token_two)我得到“ 无效指针

为什么我没有收到错误消息free(token_one)?处理此问题的正确方法是什么?

glg*_*lgl 5

如果您查看其strtok()工作原理,将立即清楚:

  1. 第一次调用将strtok()返回给定的指针,通过用NUL字节替换下一个分隔字符来修改其指向的字符串。
  2. 任何后续调用(以NULL第一个参数作为参数)都对保存的指针进行操作,指针从该指针之前指向被替换字符之后的指针。

So the first free() call succeeds iff your my_buffer came from malloc(). The second one fails because, well, why shouldn't it? It doesn't come from malloc() et al., so calling free() on it is undefined behaviour.

  • @ user4789408是的,但是那部分内存不是新的内存块,而是初始字符串的一部分。一旦释放了第一个指针,通过第二个指针的任何访问都是非法的,因为指向它的存储区不再是您的。 (2认同)