请告诉我为什么这个函数可能以作为第二个参数,编译和崩溃?为什么strcat导致崩溃?
char var[9];
/*some initialization of var */
strcat(var, '\0');
请告诉我为什么这个函数可能以作为第二个参数,编译和崩溃?为什么strcat导致崩溃?
char var[9];
/*some initialization of var */
strcat(var, '\0');
即函数需要一个const char *
作为第二个参数。你通过了int
。
char *strcat(char *restrict s1, const char *restrict s2);
你基本上欺骗strcat
到提领\0
作为指针 - 它解引用NULL
。
strcat
的第二个参数应该是指针到一个以空字符结尾的字符数组。 你的代码甚至不应该编译,但如果是,那么结果将是未定义的行为。
也谢谢你) – 2012-02-24 10:15:53
编译完全可以,''\ 0''是int'0',一个空指针常量,所以调用的是'strcat(var,NULL);'。错误但有效。只有'strcat'不检查空指针并适当地处理它们(这意味着,在实践中,它将是UB)。 – 2012-02-24 12:33:05
@DanielFischer:啊,是的,这是一个好点;它在这种情况下是有效的,因为它是恒定的0 – 2012-02-24 12:37:35
如果注释是为了描述以下行(而不是充当那个被省略了一些实际的初始化一个占位符),还有第二个场景:
由于strcat()
需要找到的结束第一个参数为了找出开始连接的位置,并且将它传递给未初始化的字符数组,它可能会在寻找第一个字符串的终止字符的同时跳出有效内存。在有效内存之外读取可能会在某些平台上导致崩溃。
因此,有可能第二个参数与它为什么会中断无关,尽管这当然也是错误的。
char var [9]; /*一些初始化var * / – 2012-02-24 10:22:05
非常感谢您的快速回答。 – 2012-02-24 10:13:37