关于strcat与memcpy的困惑

时间:2016-12-15 05:33:26

标签: c string c-strings strcat

好的,所以我看到了一些带memcpy的strcat函数的实现。我知道它很有效率,因为不需要分配。但是,如何使用结果字符串保留覆盖源字符串的内容。

例如,让我们采取 - :

char *str1 = "Hello";
char *str2 = "World";

str1 = strcat(str1, str2);

如何确保在str2中不会覆盖结果“HelloWorld”字符串的内容?

此外,如果字符串只是char数组,并且假设数组具有固定大小,则无需重新分配内存如果我将字节复制到大于数组的数组中,则isn'那不安全吗?

2 个答案:

答案 0 :(得分:1)

不是不安全,而是undefined behavior

首先,您正在尝试修改字符串文字,它本身会调用UB。

其次,关于目标缓冲区的大小,引用man page强调我的

  

strcat()函数src字符串追加dest字符串,在结尾处覆盖终止空字节('\0'dest,然后添加一个终止空字节。字符串可能不重叠,dest字符串必须有足够的空间用于结果。如果dest不够大,则程序行为无法预测; [...]

答案 1 :(得分:1)

  

我知道它很有效率,因为不需要分配。

这是一个错误的理解。 memcpystrcat都不分配内存。两者都要求您传递指向足够数量的有效内存的指针。如果不是这种情况,程序将受到不确定的行为。

由于以下几个原因,您发布的代码会受到未定义的行为的影响:

  1. str1指向字符串文字,它位于程序的只读部分。

  2. str1没有足够的内存来保存字符串"HelloWorld"和终止空字符。