linux 现在不要推荐使用 strtok,转而推荐strsep,也确实没有线程安全问题,更加好用,但是这个函数对于理解不深的同学还是有一定的使用陷阱:
如果这个函数分解的是一个 malloc的字符串,将申请内存的指针直接传入而没有备份的话,会导致指针指向变化,因为第一个参数是个二级指针,该函数的运作决定这个指针会根据分解字符串的过程导致指针不断向后推移。
char * strsep(char **s, const char *ct)
{
char *sbegin = *s, *end;
if (sbegin == NULL)
return NULL;
end = strpbrk(sbegin, ct);
if (end)
*end++ = '\0';
*s = end;
return sbegin;
}
如果最后还是 free 刚才的指针,可能会导致内存报错问题或者泄露了。
因此使用前,应该备份申请返回的指针,来用做释放内存。
栈内存不用考虑这个问题。