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

标签 c pointers undefined-behavior strtok invalid-pointer

我已经看过与此类似的帖子,但我发现了一些差异,这让我走上了错误的道路。

我有这个代码:

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

free(token_one);
free(token_two);

我看到有人说与 strtok 一起使用的变量不应被释放,但为什么在执行此代码时我得到了这个:

免费(token_one)没有错误

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

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

最佳答案

如果你看看 strtok() 是如何工作的,你就会立刻明白:

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

因此,如果您的 my_buffer 来自 malloc(),则第一个 free() 调用会成功。第二个失败了,因为,为什么不呢?它不是来自 malloc() 等,因此对其调用 free() 是未定义的行为。

关于与 strtok 一起使用的 C 自由变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57693646/

相关文章:

c - 在c中获取字符串的子字符串

c - 给char指针赋值,但是说Access violation writing location

c++ - 不同的内在行为取决于 GCC 版本

c - 函数中的操作数组 - c - 段错误

c++ - 在 C++ 中将 char 指针存储到字符串中的最有效方法是什么

c++ - C++ 标准对堆栈溢出有何规定?

无符号整数递增会导致未定义的行为吗?

c - 将 1-100 int 乘以 -1 或将所述 int 设置为零是否需要更多时间?

C - 在没有 strcmp 的情况下测试字符串等价性

c - 库存计划,可能的边界值问题?