C中的Memmove()打印结果两次

时间:2016-04-07 03:52:34

标签: c memmove

我正在玩memmove,我理解它是如何工作的。但是,只要最终结果包含的内容超过原始源大小,它就会打印出一堆随机数。例如:

char str[] = "abcdefgh";
memmove(str + 6, str + 3, 4);
printf("%s\n", str);

给我输出abcdefdefgbdefggh什么时候它应该给我 abcdefdefg为什么其他字符被添加到str?

2 个答案:

答案 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时你会得到奇怪的结果,因为字符串终止消失了。