我将目标的大小定义为字符串1的大小。然后我将字符串2添加到目标。我没有增加目标的大小。为什么我的静态代码可以工作?
char *string1 = "this is a ";
char *target = malloc(sizeof(string1)); // if i don't do this, code gives error.
strcpy(target, string1);
printf("%sn", target);
char *string2 = "string";
strcat(target, string2); // how come I don't need to call malloc again?
printf("%sn", target); // works
我在mac上用Xcode编译了这个。
它之所以有效,是因为你很幸运。写过缓冲区的末尾是损坏缓冲区后面的数据并导致程序以恶劣方式崩溃的好方法。
事实上,即使是第一次你也很幸运。Sizeof返回变量类型的大小,它是一个指针,而不是字符串的长度。即使使用了strlen(string1),也必须添加1,以便为终止字符串的null字符留出空间。
C会让你自己动手。你有责任确保你没有这样做,和/或使用lint
等工具对你的代码进行额外的测试,以捕捉其他语言经常检查的一些错误。(或者以更高的警告级别运行编译器。)
另一方面,当你真的想作弊时,能够用C作弊是它强大的原因之一——就像汇编代码一样,如果你知道自己在做什么,你就可以打破规则去做一些原本很难做到甚至不可能做到的事情。这是一把锋利的刀。小心知道你周围是什么,以防它滑落。
代码中的一些问题。
-
您认为
sizeof(string1)
应该返回什么?你试过了吗?你知道sizeof()和strlen()之间的区别吗?顺便说一下,sizeof(string1)
将返回指向字符的指针的字节大小,通常为4字节。 -
检查
strcat()
文档
"destination:指向目标数组的指针,该数组应包含C字符串,并且足够大以包含连接的结果一串">
如果它"工作"了几次,并不意味着代码是正确的。你必须明白,你在一段没有分配的内存中写入信息。