memcpy() is generally used to copy a portion of memory chuck from one location to another location. memcpy() works fine when there is no overlapping between source and destination. Lets consider a overlapping of buffer in the front side/lower side. Below picture shows the details.

memcpy() where overlapping in lower side of memory

void memcpy(void *dest, void *src, int size)
{
  int i;
  for (= 0; i < size; i++)
  {
    ((char *)dest)[i] = ((char *)src)[i];
  }
}
10  void print_elements(char *array, int size)
11  {
12    int i;
13    printf ("Elements : ");
14    for (= 0; i < size; i++) {
15      printf ("%c, ", array[i]);
16    }
17    printf ("\n");
18  }
19  int main(int argc, char* argv[])
20  {
21    char c_array[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
22    print_elements(c_array, sizeof(c_array));
23    printf("After memcpy()\n");
24    memcpy((void *)&c_array[1], (void *)&c_array[3], 5);
25    print_elements(c_array, sizeof(c_array));
26  }
27  Output
28  Elements : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
29  After memcpy()
30  Elements : 0, 3, 4, 5, 6, 7, 6, 7, 8, 9,
31 

However memcpy() works fine here. Now consider a case where overlapping is there at the trailing side or in upper side of the memory.

memcpy() where overlapping in upper side of memory

void memcpy(void *dest, void *src, int size)
{
  int i;
  for (= 0; i < size; i++)
  {
    ((char *)dest)[i] = ((char *)src)[i];
  }
}
10  void print_elements(char *array, int size)
11  {
12    int i;
13    printf ("Elements : ");
14    for (= 0; i < size; i++) {
15      printf ("%c, ", array[i]);
16    }
17    printf (" ");
18  }
19  int main(int argc, char* argv[])
20  {
21    char c_array[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
22    print_elements(c_array, sizeof(c_array));
23    printf("After memcpy()\n");
24    memcpy((void *)&c_array[5], (void *)&c_array[3], 5);
25    print_elements(c_array, sizeof(c_array));
26  }
27  Output
28  Elements : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
29  After memcpy()
30  Elements : 0, 1, 2, 3, 4, 3, 4, 3, 4, 3,
31 

Here result is not expected. From the above graphical view it is clear that some mechanism should be there to take care of the overlapping and displacement of elements should be in the reverse direction when overlapping is at the trailing side. Below diagram shows how it should be.

memmove() where overlapping in upper side of memory

void memmove(void *dest, void *src, int size)
{
  int i;
  if (dest < src) {
    for (= 0; i < size; i++) {
      ((char *)dest)[i] = ((char *)src)[i];
    }
  } else {
    for (= size - 1; i >= 0; i--) {
10        ((char *)dest)[i] = ((char *)src)[i];
11      }
12    }
13  }
14  int main(int argc, char* argv[])
15  {
16    char c_array[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
17    print_elements(c_array, sizeof(c_array));
18    printf("After memmove()\n");
19    memcpy((void *)&c_array[5], (void *)&c_array[3], 5);
20    print_elements(c_array, sizeof(c_array));
21  }
22  Output
23  Elements : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
24  After memmove()
25  Elements : 0, 1, 2, 3, 4, 3, 4, 5, 6, 7,
26 

You have viewed 1 page out of 248. Your C learning is 0.00% complete. Login to check your learning progress.

 Vote 0

Similar topics related to this section

variadic functions, variadic macro, multiple arguments in printf and scanf, strcpy and strcat source, memcpy vs memmove, strrev source, strdup, strtok, macro definition,

# C Programming Language (Prentice Hall Software)
# Let Us C Paperback - 2006 by Yashavant Kanetkar
# Understanding and Using C Pointers Core techniques for memory management
# Data Structures Using C and C++ Paperback - 1998
# Data Structures In C Paperback - August 11, 2008 by Noel Kalicharan