在阅读了man7.org的文档和StackOverflow上的一些问题后,我仍然很难理解谁管理strtok函数返回的令牌的生存期。我看到的大多数例子都显示了strtok函数的以下用法:
char *token = NULL;
token = strtok(buffer, " ");
while (token != NULL) {
token = strtok(NULL, " ");
}
我知道strtok返回一个指向下一个令牌的指针,当字符串中没有更多令牌时返回NULL。然而,我们没有为这些令牌预先分配任何存储(在堆栈上,或使用malloc)。strtok如何为每个令牌分配存储?我是否必须在每个令牌上调用free以防止内存泄漏?我可以在不使用strcpy的情况下将令牌放入数组中吗?或者它们会超出范围并从堆栈中弹出,留下一个悬挂指针数组?
谢谢!
对于这样的问题,阅读strtok()
实现的源代码可能非常有指导意义。
简而言之:
- 它返回指向
buffer
的指针,即原始字符串 - 是的,令牌被字符串终止符所取代,这就是为什么
strtok()
如此可怕并且不安全