2016-04-07 18 views
0

Memmove ile oynamaktaydım ve nasıl çalıştığını anladım. Ancak sonuç, orijinal kaynak boyutundan daha fazlasını içerdiğinde, bir grup rasgele sayı basar. Örneğin:C'deki Memmove(), sonucu iki kez yazdırır

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

bana çıktı abcdefdefgbdefggh diğer karakterler str içine ekleniyor Neden bana abcdefdefg vermelidir verir? dizeye eklenen

+7

Arabelleğinizin sonunu yazdınız. Bu tanımlanmamış davranışa neden olur. Printf ("% s") 'i dizgi olmayan bir şeyle kullandınız, bu da tanımlanmamış davranışlara neden oluyor. –

cevap

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

diğer karakterler beyan char str [] bellek konumu ötesinde karakterlerdir. Memove'de arabellek adresinin ötesine geçtiniz ve '\ 0' sonlandırma karakteri yazıldı. Printf dediğinizde, işlev '\ 0' ile karşılaşana kadar işaretçiniz tarafından başvurulan karakterleri yazdırmaya devam edecektir.

str için hafıza
0

görünüyor :

'a','b','c','d','e','f','g','h',0x0,?,?,? 
           ^
          End of buffer (terminates the string) 

Sen Yani (

a) üzerine dize sonlandırma sahip

'a','b','c','d','e','f','d','e','f','g',?,? 
           ^
          End of buffer 

verir endeksi 6'ya indeks 3 4 byte kopyalamaya 0x0) 'f'

b) arabellek dışında yazılmış (yani 'g') ich gerçekten kötü

a) Nedeniyle dize sonlandırma bittiğinde str yazdırırken garip sonuçlar elde edersiniz.