Strcpy()会破坏Solaris中复制的字符串,但不会损坏Linux

我正在为一个类编写C代码.这个类要求我们的代码在学校服务器上编译和运行,这是一个sparc solaris机器.我正在运行Linux x64.

我有这条线要解析(这不是实际的代码,但输入我的程序):

while ( cond1 ){ 

我需要将“while”和“cond1”捕获到单独的字符串中.我一直在使用strtok()来做这件事.在Linux中,以下行:

char *cond = NULL;
cond = (char *)malloc(sizeof(char));
memset(cond, 0, sizeof(char));
strcpy(cond, strtok(NULL, ": \t\(){")); //already got the "while" out of the line

将正确捕获字符串“cond1”.然而,在solaris机器上运行它,给我字符串“cone1”.

请注意,在我的程序中的许多其他情况下,字符串正在被正确复制. (例如,“while”)被正确捕获.

有谁知道这里发生了什么?

最佳答案
这条线:

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,因此您不需要乘以它.

转载注明原文:Strcpy()会破坏Solaris中复制的字符串,但不会损坏Linux - 代码日志