我将target的大小定义为string1的大小。然后我将string2添加到目标。我没有增加目标的大小。为什么我的静止代码有效?
char *string1 = "this is a ";
char *target = malloc(sizeof(string1)); // if i don't do this, code gives error.
strcpy(target, string1);
printf("%s\n", target);
char *string2 = "string";
strcat(target, string2); // how come I don't need to call malloc again?
printf("%s\n", target); // works
我用mac上的Xcode编译了这个。
答案 0 :(得分:1)
代码中的一些问题。
您认为sizeof(string1)
应该返回什么?你试过吗?您知道sizeof()和strlen()之间的区别吗?顺便说一下,sizeof(string1)
将返回指向char的指针的字节大小,通常为4个字节。
检查strcat()
documentation
“destination:指向目标数组的指针,该数组应包含C 字符串,并且足够大以包含连接的结果 字符串“
如果它“有效”几次,并不代表代码是正确的。您必须了解您正在将一些内容写入未分配的内存中。
答案 1 :(得分:1)
这很有效,因为你很幸运。写入缓冲区的末尾是一种破坏缓冲区后面数据的好方法,会导致程序以恶劣的方式爆炸。
实际上即使是第一次你也很幸运。 Sizeof返回变量类型的大小,它是一个指针,而不是字符串的长度。即使您使用了strlen(string1),您还必须添加1以允许空字符结束字符串。
C会让你自己开枪。您有责任确保不这样做,和/或使用lint
等工具对代码运行其他测试,以捕获其他语言经常检查的一些错误。 (或者以更高的警告级别运行编译器。)
另一方面,当你真正想要的时候能够在C中作弊是让它变得强大的东西之一 - 就像汇编代码一样,如果你知道你在做什么,你可以违反规则去做否则将难以实现的事情。这是一把锋利的刀。如果它滑倒,请小心知道你身边的东西。