【发布时间】:2014-04-21 06:50:00
【问题描述】:
我正在使用 strtok 来标记字符串,strtok 会影响原始缓冲区吗?例如:
*char buf[] = "This Is Start Of life";
char *pch = strtok(buf," ");
while(pch)
{
printf("%s \n", pch);
pch = strtok(NULL," ");
}*
printf("Orignal Buffer:: %s ",buf);
Output is::
This
Is
Start
Of
life
Original Buffer:: This
我读到 strtok 返回指向下一个标记的指针,那么 buf 是如何受到影响的?有没有办法保留原始缓冲区(没有额外的复制开销)?
后续问题:: 从到目前为止的答案我想没有办法保留缓冲区。那么如果我使用动态数组创建原始缓冲区,如果strtok会影响它,那么释放原始缓冲区时会出现内存泄漏还是strtok负责释放内存?
【问题讨论】:
-
只要保留
malloc()(或calloc()或realloc()——或任何用于分配内存的例程)返回的指针,就可以使用free()释放指针.分配例程不关心分配的内存中的数据;他们只需要你传递一个指向他们之前分配的内存块的指针。 -
作为一个不相关但重要的注意事项,您可能需要考虑使用 strtok() 的可重入形式,它是线程安全的,如 linux 中的 strtok_r 或 Windows 中的 strtok_s。另外,我通常只在关心避免复制缓冲区时才使用 strtok。在其他情况下,我可能会转向更 C++ 式的标记化技术,例如stackoverflow.com/questions/53849/…