Действительно ли memmove "перемещает" кусок памяти и оставляет после себя нули в источнике?
Возможный дубликат:
memcpy против memmove
Действительно ли memmove "перемещает" кусок памяти? Если так, то это оставляет память с нулями? Или это как memcpy? Я смотрю на справочную страницу и не верю, что мое предположение верно. Если я хочу переместить часть памяти, используя memmove, должен ли я вручную обнулить часть памяти, куда я сделал перемещение?
2 ответа
memmove
не имеет ничего общего с очисткой старой памяти, и фактически в тех ситуациях, когда вы хотели бы использовать memmove
очистка старой памяти уничтожит только что скопированные данные! Это потому что memmove
полезно только тогда, когда вы ожидаете, что диапазоны источника и назначения перекрываются.
Обычно, если вам нужно memmove
Показательно, что у вас есть серьезная фундаментальная неэффективность в вашем дизайне. Например, часто новые программисты на C пытаются использовать memmove
удалить первые несколько символов строки (например, memmove(s, &s[1], len)
) а не просто используя s+1
или же &s[1]
обратиться к хвосту строки. Алгоритмы, содержащие memmove
редко работают лучше, чем O(n^2).
Не совсем:
Основное различие между memmove
а также memcpy
в том, что memmove
может использоваться для перемещения фрагмента памяти куда-то, что перекрывает блок памяти, который вы пытаетесь переместить. И, следовательно, оригинальный указатель больше не будет действительным.
С memcpy
с другой стороны, две области не могут перекрываться.
memmove
не обнуляет оригинальный блок памяти. Если вы хотите сделать это, вам придется явно сделать это самостоятельно с помощью memset. Как правило, подпрограммы C не тратят циклы, выполняя ненужные вещи, такие как обнуление памяти. Сравнить с malloc
, который также не обнуляет блок памяти.