2016-04-07 2 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) 

Другие символы, добавленные в строку, являются символами, находящимися за пределами ячейки памяти объявленной символьной строки []. Вы перешли за буферный адрес в memmove, и завершающий символ «\ 0» был написан поверх. Поэтому, когда вы вызываете printf, функция будет продолжать печатать символы, на которые ссылается ваш указатель, до тех пор, пока он не встретит «\ 0».

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 

Так у вас есть

а) перезаписаны окончание строки (0x0) на 'f'

b) записанный за пределами буфера (например, 'g') wh ich действительно плохо

Из-за а) вы получите странные результаты при печати str, поскольку прекращение строки ушло.

Смежные вопросы