簡體   English   中英

C中的Memmove()將結果打印兩次

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM