我正在玩memmove,我理解它是如何工作的。但是,只要最终结果包含的内容超过原始源大小,它就会打印出一堆随机数。例如:
char str[] = "abcdefgh";
memmove(str + 6, str + 3, 4);
printf("%s\n", str);
给我输出abcdefdefgbdefggh
什么时候它应该给我
abcdefdefg
为什么其他字符被添加到str?
答案 0 :(得分:0)
memmove(void *destination, void *source, size_t bytesToCopy)
添加到字符串中的其他字符是超出声明的char str []的内存位置的字符。你已经超越了memmove中的缓冲区地址和' \ 0'的终止字符。已经写完了。因此,当您调用printf时,该函数将继续打印指针引用的字符,直到遇到' \ 0'。
答案 1 :(得分:0)
str
的内存看起来:
'a','b','c','d','e','f','g','h',0x0,?,?,?
^
End of buffer (terminates the string)
将4个字节从索引3复制到索引6,后者为
'a','b','c','d','e','f','d','e','f','g',?,?
^
End of buffer
所以你有
a)用' f'
覆盖字符串终止(0x0)b)写在缓冲区外(即“#'”),这是非常糟糕的
由于a)在打印str
时你会得到奇怪的结果,因为字符串终止消失了。