2012-02-24 182 views

回答

4

即函数需要一个const char *作为第二个参数。你通过了int

char *strcat(char *restrict s1, const char *restrict s2); 

你基本上欺骗strcat到提领\0作为指针 - 它解引用NULL

+0

非常感谢您的快速回答。 – 2012-02-24 10:13:37

1

strcat的第二个参数应该是指针到一个以空字符结尾的字符数组。 你的代码甚至不应该编译,但如果是,那么结果将是未定义的行为

+0

也谢谢你) – 2012-02-24 10:15:53

+0

编译完全可以,''\ 0''是int'0',一个空指针常量,所以调用的是'strcat(var,NULL);'。错误但有效。只有'strcat'不检查空指针并适当地处理它们(这意味着,在实践中,它将是UB)。 – 2012-02-24 12:33:05

+0

@DanielFischer:啊,是的,这是一个好点;它在这种情况下是有效的,因为它是恒定的0 – 2012-02-24 12:37:35

0

如果注释是为了描述以下行(而不是充当那个被省略了一些实际的初始化一个占位符),还有第二个场景:

由于strcat()需要找到的结束第一个参数为了找出开始连接的位置,并且将它传递给未初始化的字符数组,它可能会在寻找第一个字符串的终止字符的同时跳出有效内存。在有效内存之外读取可能会在某些平台上导致崩溃。

因此,有可能第二个参数与它为什么会中断无关,尽管这当然也是错误的。

+0

char var [9]; /*一些初始化var * / – 2012-02-24 10:22:05