我正在玩memmove,我明白它是如何工作的。但是,只要最終結果包含的內容超過原始源大小,它就會打印出一堆隨機數。例如:Memmove()在C打印結果兩次
char str[] = "abcdefgh";
memmove(str + 6, str + 3, 4);
printf("%s\n", str);
給我的輸出abcdefdefgbdefggh
時,它應該給我 abcdefdefg
爲什麼其他字符添加到海峽?
我正在玩memmove,我明白它是如何工作的。但是,只要最終結果包含的內容超過原始源大小,它就會打印出一堆隨機數。例如:Memmove()在C打印結果兩次
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 []的內存位置的字符。你已經超越了memmove中的緩衝區地址,'\ 0'的終止字符已被覆蓋。所以當你調用printf時,函數將繼續打印指針引用的字符,直到遇到'\ 0'。
爲str
內存看起來:
'a','b','c','d','e','f','g','h',0x0,?,?,?
^
End of buffer (terminates the string)
您從指數3拷貝4個字節到給
'a','b','c','d','e','f','d','e','f','g',?,?
^
End of buffer
所以,你必須
一)覆蓋的串端接(指數6 0x0)'f'
b)寫在緩衝區外(即'g')wh ich真的很不好
由於a)在打印str
時因爲字符串終止消失,您會得到奇怪的結果。
你寫過緩衝區的末尾。這會導致未定義的行爲。你用'printf(「%s」'這個不是字符串的東西,這也會導致未定義的行爲。 –