【发布时间】:2011-01-30 02:54:39
【问题描述】:
我自己尝试实现strcat,从Wiki找到strcat实现是这样的……但是我用的时候,出现segmentation fault。
下面的代码有什么问题?
char *
strcat(char *dest, const char *src)
{
size_t i,j;
for (i = 0; dest[i] != '\0'; i++)
;
for (j = 0; src[j] != '\0'; j++)
dest[i+j] = src[j];
dest[i+j] = '\0';
return dest;
}
【问题讨论】:
-
代码看起来不错。你确定你使用正确吗?什么是“客户端代码”?
-
检查
dest或src是否为空。 -
在标准 C 中,当任一指针为空时,库可以做它喜欢做的事情;行为未定义。合法的未定义行为确实包括“正常工作”;它还包括“使用核心转储崩溃”和“删除机器上您有权删除的每个文件”。不要冒险——不要使用空指针调用库函数。
-
问题应该是:“为什么维基百科的 strcat 实现错误?”。您应该在 wiki 讨论页面 (en.wikipedia.org/wiki/Talk:Strcat) 上询问。此外,可能是您的客户端代码(甚至可能不存在)损坏了。
-
非常正确,但是在重新实现库函数时,特别是在报告分段违规时,检查空值并遵循最小意外原则似乎是合适的做法。