每次更改内容时,是否需要更改char指针的大小?

时间:2014-02-07 21:42:54

标签: c pointers char malloc string-concatenation

我将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编译了这个。

2 个答案:

答案 0 :(得分:1)

代码中的一些问题。

  1. 您认为sizeof(string1)应该返回什么?你试过吗?您知道sizeof()strlen()之间的区别吗?顺便说一下,sizeof(string1)将返回指向char的指针的字节大小,通常为4个字节。

  2. 检查strcat() documentation

  3.   

    “destination:指向目标数组的指针,该数组应包含C   字符串,并且足够大以包含连接的结果   字符串“

    如果它“有效”几次,并不代表代码是正确的。您必须了解您正在将一些内容写入未分配的内存中。

答案 1 :(得分:1)

这很有效,因为你很幸运。写入缓冲区的末尾是一种破坏缓冲区后面数据的好方法,会导致程序以恶劣的方式爆炸。

实际上即使是第一次你也很幸运。 Sizeof返回变量类型的大小,它是一个指针,而不是字符串的长度。即使您使用了strlen(string1),您还必须添加1以允许空字符结束字符串。

C会让你自己开枪。您有责任确保不这样做,和/或使用lint等工具对代码运行其他测试,以捕获其他语言经常检查的一些错误。 (或者以更高的警告级别运行编译器。)

另一方面,当你真正想要的时候能够在C中作弊是让它变得强大的东西之一 - 就像汇编代码一样,如果你知道你在做什么,你可以违反规则去做否则将难以实现的事情。这是一把锋利的刀。如果它滑倒,请小心知道你身边的东西。