memmove() is used to copy a block of memory from a location to another. It is declared in string.h
// Copies "numBytes" bytes from address "from" to address "to"
void * memmove(void *to, const void *from, size_t numBytes);
Below is a sample C program to show the working of memmove().
C
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "Geeks" ;
char str2[] = "Quiz" ;
puts ( "str1 before memmove " );
puts (str1);
memmove (str1, str2, sizeof (str2));
puts ( "\nstr1 after memmove " );
puts (str1);
return 0;
}
|
Output
str1 before memmove
Geeks
str1 after memmove
Quiz
How is it different from memcpy()?
memcpy() simply copies data one by one from one location to another. On the other hand memmove() copies the data first to an intermediate buffer, then from the buffer to destination.
memcpy() leads to problems when strings overlap.
For example, consider below program.
C
#include <stdio.h>
#include <string.h>
int main()
{
char csrc[100] = "Geeksfor" ;
memcpy (csrc + 5, csrc, strlen (csrc) + 1);
printf ( "%s" , csrc);
return 0;
}
|
Since the input addresses are overlapping, the above program overwrites the original string and causes data loss.
Consider the below program for understanding the difference between the memcpy and memmove function in case of overlapping happens.
C
#include <stdio.h>
#include <string.h>
int main()
{
char str[100] = "Learningisfun" ;
char *first, *second;
first = str;
second = str;
printf ( "Original string :%s\n " , str);
memcpy (first + 8, first, 10);
printf ( "memcpy overlap : %s\n " , str);
memmove (second + 8, first, 10);
printf ( "memmove overlap : %s\n " , str);
return 0;
}
|
Output
Original string :Learningisfun
memcpy overlap : LearningLearningis
memmove overlap : LearningLearningLe
As you can see clearly with memmove function whenever overlap happens (i.e when the first pointer moves to the character ‘i’) then the first pointer will start to print from the beginning (output Le) but with memcpy function, it just ignores if there is an overlap and just keep moving forward.
Write your own memcpy() and memmove()?
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
Whether you're preparing for your first job interview or aiming to upskill in this ever-evolving tech landscape,
GeeksforGeeks Courses are your key to success. We provide top-quality content at affordable prices, all geared towards accelerating your growth in a time-bound manner. Join the millions we've already empowered, and we're here to do the same for you. Don't miss out -
check it out now!
Last Updated :
10 Dec, 2021
Like Article
Save Article