[英]Memmove() in C prints the result twice
我當時正在玩memmove,我知道它是如何工作的。 但是,只要最終結果包含的大小超過原始來源大小,就會打印出一堆隨機數。 例如:
char str[] = "abcdefgh";
memmove(str + 6, str + 3, 4);
printf("%s\n", str);
給我的輸出abcdefdefgbdefggh
時,它應該給我abcdefdefg
為什么其他字符添加到海峽?
memmove(void *destination, void *source, size_t bytesToCopy)
添加到字符串中的其他字符是超出聲明的char str []的內存位置的字符。 您已超出記憶體中的緩沖區地址,並且終止字符'\\ 0'已被覆蓋。 因此,當您調用printf時,該函數將繼續打印指針所引用的字符,直到遇到'\\ 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)寫在緩沖區之外(即“ g”),這確實很糟糕
由於a)由於字符串終止,在打印str
時您會得到奇怪的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.