这条线:
cond = (char *)malloc(sizeof(char));
只分配一个char用于存储,然后在其中复制多个 – strcpy需要至少放置null终止符,但在你的情况下,也是你的strtok的结果.
它可能在不同的系统上工作的原因是malloc的某些实现将以某个分辨率(例如,16个字节的倍数)分配,无论您要求的是什么实际值,因此最后可能有一些空闲空间你的缓冲区.但你正在尝试的仍然是非常不明确的行为.
未定义的行为可能有效的事实有时绝不会消除您避免此类行为的责任.
分配足够的空间来存储你的strtok的结果,你应该没问题.
最安全的方法是动态分配空间,使其至少与传递给strtok的字符串一样大.这样就不会有溢出的可能性(除了奇怪的边缘情况,其他线程可能会修改你背后的数据但是,如果是这种情况,strtok无论如何都是一个非常糟糕的选择).
类似的东西(如果instr是你的原始输入字符串):
cond = (char*)malloc(strlen(instr)+1);
这保证了从instr中提取的任何标记都适合cond.
另外,根据定义,sizeof(char)总是1,因此您不需要乘以它.