gpt4 book ai didi

c - Srcpy() 在 Solaris 中破坏了复制的字符串,但在 Linux 中没有

转载 作者:太空狗 更新时间:2023-10-29 15:47:07 25 4
gpt4 key购买 nike

我正在为一个类编写 C 代码。该类(class)要求我们的代码在学校服务器上编译运行,该服务器是一台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 需要至少放置一个空终止符,但是,你的情况,还有你的 strtok 的结果。

它可能在不同系统上工作的原因是 malloc 的某些实现将以特定分辨率分配(例如,16 字节的倍数),无论您要求什么实际值,所以您的缓冲区末尾可能有一些可用空间。但是您正在尝试的仍然是非常未定义的行为。

事实上,未定义的行为有时可能会起作用,但这并不免除您避免此类行为的责任。

分配足够的空间来存储您的 strtok 的结果,您应该没问题。

最安全的方法是动态分配空间,使其至少与传递给 strtok 的字符串一样大。这样就不会有溢出的可能性(除了奇怪的边缘情况,其他线程可能会在您背后修改数据,但如果是这种情况,无论如何 strtok 将是一个非常糟糕的选择)。

类似于(如果 instr 是您的原始输入字符串):

cond = (char*)malloc(strlen(instr)+1);

这保证了从 instr 中提取的任何标记都将适合 cond

顺便说一句,根据定义,sizeof(char) 始终为 1,因此您无需乘以它。

关于c - Srcpy() 在 Solaris 中破坏了复制的字符串,但在 Linux 中没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2650810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com