好的,所以我看到了一些带memcpy的strcat函数的实现。我知道它很有效率,因为不需要分配。但是,如何使用结果字符串保留覆盖源字符串的内容。
例如,让我们采取 - :
char *str1 = "Hello";
char *str2 = "World";
str1 = strcat(str1, str2);
如何确保在str2
中不会覆盖结果“HelloWorld”字符串的内容?
此外,如果字符串只是char数组,并且假设数组具有固定大小,则无需重新分配内存如果我将字节复制到大于数组的数组中,则isn'那不安全吗?
答案 0 :(得分:1)
不是不安全,而是undefined behavior。
首先,您正在尝试修改字符串文字,它本身会调用UB。
其次,关于目标缓冲区的大小,引用man page(强调我的)
strcat()
函数将src
字符串追加到dest
字符串,在结尾处覆盖终止空字节('\0'
)dest
,然后添加一个终止空字节。字符串可能不重叠,和dest
字符串必须有足够的空间用于结果。如果dest
不够大,则程序行为无法预测; [...]
答案 1 :(得分:1)
我知道它很有效率,因为不需要分配。
这是一个错误的理解。 memcpy
和strcat
都不分配内存。两者都要求您传递指向足够数量的有效内存的指针。如果不是这种情况,程序将受到不确定的行为。
由于以下几个原因,您发布的代码会受到未定义的行为的影响:
str1
指向字符串文字,它位于程序的只读部分。
str1
没有足够的内存来保存字符串"HelloWorld"
和终止空字符。