2016-04-07 91 views
0

我正在玩memmove,我明白它是如何工作的。但是,只要最終結果包含的內容超過原始源大小,它就會打印出一堆隨機數。例如:Memmove()在C打印結果兩次

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

給我的輸出abcdefdefgbdefggh時,它應該給我 abcdefdefg爲什麼其他字符添加到海峽?

+7

你寫過緩衝區的末尾。這會導致未定義的行爲。你用'printf(「%s」'這個不是字符串的東西,這也會導致未定義的行爲。 –

回答

0
memmove(void *destination, void *source, size_t bytesToCopy) 

添加到字符串的其他字符是超出您聲明的char str []的內存位置的字符。你已經超越了memmove中的緩衝區地址,'\ 0'的終止字符已被覆蓋。所以當你調用printf時,函數將繼續打印指針引用的字符,直到遇到'\ 0'。

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時因爲字符串終止消失,您會得到奇怪的結果。