Using memset(), memcpy(), and memmove() in C

By: Emiley J Viewed: 157454 times  Printer Friendly Format    


The memset() Function

To set all the bytes in a block of memory to a particular value, use memset(). The function prototype is

void * memset(void *dest, int c, size_t count);

The argument dest points to the block of memory. c is the value to set, and count is the number of bytes, starting at dest, to be set. Note that while c is a type int, it is treated as a type char. In other words, only the low-order byte is used, and you can specify values of c only in the range 0 through 255.

Use memset() to initialize a block of memory to a specified value. Because this function can use only a type char as the initialization value, it is not useful for working with blocks of data types other than type char, except when you want to initialize to 0. In other words, it wouldn't be efficient to use memset() to initialize an array of type int to the value 99, but you could initialize all array elements to the value 0. memset() will be demonstrated in program below.

The memcpy() Function

memcpy() copies bytes of data between memory blocks, sometimes called buffers. This function doesn't care about the type of data being copied--it simply makes an exact byte-for-byte copy. The function prototype is

void *memcpy(void *dest, void *src, size_t count);

The arguments dest and src point to the destination and source memory blocks, respectively. count specifies the number of bytes to be copied. The return value is dest. If the two blocks of memory overlap, the function might not operate properly--some of the data in src might be overwritten before being copied. Use the memmove() function, discussed next, to handle overlapping memory blocks. memcpy() will be demonstrated in program below.

The memmove() Function

memmove() is very much like memcpy(), copying a specified number of bytes from one memory block to another. It's more flexible, however, because it can handle overlapping memory blocks properly. Because memmove() can do everything memcpy() can do with the added flexibility of dealing with overlapping blocks, you rarely, if ever, should have a reason to use memcpy(). The prototype is

void *memmove(void *dest, void *src, size_t count);

dest and src point to the destination and source memory blocks, and count specifies the number of bytes to be copied. The return value is dest. If the blocks overlap, this function ensures that the source data in the overlapped region is copied before being overwritten. Sample program below demonstrates memset(), memcpy(), and memmove().

A demonstration of memset(), memcpy(), and memmove().

1: /* Demonstrating memset(), memcpy(), and memmove(). */
2:
3: #include <stdio.h>
4: #include <string.h>
4:
5: char message1[60] = "Four score and seven years ago ...";
6: char message2[60] = "abcdefghijklmnopqrstuvwxyz";
7: char temp[60];
8:
9: main()
10: {
11:    printf("\nmessage1[] before memset():\t%s", message1);
12:    memset(message1 + 5, `@', 10);
13:    printf("\nmessage1[] after memset():\t%s", message1);
14:
15:    strcpy(temp, message2);
16:    printf("\n\nOriginal message: %s", temp);
17:    memcpy(temp + 4, temp + 16, 10);
18:    printf("\nAfter memcpy() without overlap:\t%s", temp);
19:    strcpy(temp, message2);
20:    memcpy(temp + 6, temp + 4, 10);
21:    printf("\nAfter memcpy() with overlap:\t%s", temp);
22:
23:    strcpy(temp, message2);
24:    printf("\n\nOriginal message: %s", temp);
25:    memmove(temp + 4, temp + 16, 10);
26:    printf("\nAfter memmove() without overlap:\t%s", temp);
27:    strcpy(temp, message2);
28:    memmove(temp + 6, temp + 4, 10);
29:    printf("\nAfter memmove() with overlap:\t%s\n", temp);
30:
31: }
message1[] before memset():     Four score and seven years ago ...
message1[] after memset():      Four @@@@@@@@@@seven years ago ...
Original message: abcdefghijklmnopqrstuvwxyz
After memcpy() without overlap: abcdqrstuvwxyzopqrstuvwxyz
After memcpy() with overlap:    abcdefefefefefefqrstuvwxyz
Original message: abcdefghijklmnopqrstuvwxyz
After memmove() without overlap:        abcdqrstuvwxyzopqrstuvwxyz
After memmove() with overlap:   abcdefefghijklmnqrstuvwxyz

ANALYSIS: The operation of memset() is straightforward. Note how the pointer notation message1 + 5 is used to specify that memset() is to start setting characters at the sixth character in message1[] (remember, arrays are zero-based). As a result, the 6th through 15th characters in message1[] have been changed to @.

When source and destination do not overlap, memcpy() works fine. The 10 characters of temp[] starting at position 17 (the letters q through z) have been copied to positions 5 though 14, where the letters e though n were originally located. If, however, the source and destination overlap, things are different. When the function tries to copy 10 characters starting at position 4 to position 6, an overlap of 8 positions occurs. You might expect the letters e through n to be copied over the letters g through p. Instead, the letters e and f are repeated five times.

If there's no overlap, memmove() works just like memcpy(). With overlap, however, memmove() copies the original source characters to the destination.


DO use memmove() instead of memcpy() in case you're dealing with overlapping memory regions.

DON'T try to use memset() to initialize type int, float, or double arrays to any value other than 0.




Most Viewed Articles (in C )

Latest Articles (in C)

Comment on this tutorial

Subscribe to Tutorials

Related Tutorials

Archived Comments

1. Very good !!
View Tutorial          By: SGK at 2009-04-26 23:53:44

2. Its really good and helpfull..........
chee

View Tutorial          By: sumit at 2009-04-28 05:17:17

3. helpfull !!!!
View Tutorial          By: Anonymous at 2009-05-12 03:48:15

4. Awesome .
Helpfull!!

View Tutorial          By: ARMLAB-NG at 2009-06-06 09:22:00

5. Thanks that made this concept of memory very cleat
View Tutorial          By: Tarak at 2009-06-24 07:58:04

6. it was very helpful to fix one obscure bug
View Tutorial          By: ander13 at 2009-06-30 04:51:47

7. Helpful..........

Good

View Tutorial          By: Ravi at 2009-07-03 07:08:56

8. realy good explanation
View Tutorial          By: pandit at 2009-07-19 11:24:55

9. Thanks a lot.. it made my concepts of memmove,mems
View Tutorial          By: Rimmi Jain at 2009-07-23 06:42:01

10. Good and very clear explanation...
View Tutorial          By: Pavana at 2010-01-05 23:35:30

11. It's Very Nice. Particularly:
DO use memmov

View Tutorial          By: Rasmi Ranjan Nayak at 2010-01-12 04:40:18

12. Very clearly explained...
View Tutorial          By: Bina at 2010-04-08 06:56:37

13. This example is very good, but it doesnt work in M
View Tutorial          By: soma at 2010-04-13 04:34:00

14. Very good explanation specially overlapped memory
View Tutorial          By: MANISH RASTOGI at 2010-06-22 05:44:07

15. VERY USEFUL ONE....
View Tutorial          By: Anonymous at 2010-06-30 03:15:20

16. message1[] before memset(): Four score and seven y
View Tutorial          By: Mithun at 2010-07-05 02:56:27

17. Very good tutorial, but I have a small question he
View Tutorial          By: Mohammad NABIL at 2010-07-20 05:58:19

18. Excellent.
Just one question... What is the

View Tutorial          By: HeilGates at 2010-08-04 13:38:12

19. hey awesome.....................Thanku very much
View Tutorial          By: bharath at 2010-08-23 04:26:17

20. To 15:
Sometimes it is useful to return the

View Tutorial          By: Anderson Goulart at 2010-08-24 19:15:14

21. To 16:
size_t is an ISO specification and m

View Tutorial          By: Anderson Goulart at 2010-08-24 19:24:15

22. http://captchas.net/http://capthttp:http://captcha
View Tutorial          By: varun at 2010-09-06 08:49:23

23. Hello friends can anybody tell me how to assign in
View Tutorial          By: gnvkdramesh at 2010-09-10 04:27:46

24. Really good
View Tutorial          By: Sunita at 2010-10-24 23:27:11

25. Very good.
Nice explanation.

View Tutorial          By: toon at 2010-10-29 20:12:12

26. Neatly explained about the three important functio
View Tutorial          By: Jitendra Lenka at 2011-02-03 06:34:10

27. Really very good explanation..........
View Tutorial          By: deepika at 2011-02-08 22:56:48

28. could somebody please tell a case where memcpy() w
View Tutorial          By: freak at 2011-02-09 20:29:26

29. great info thankz...
View Tutorial          By: rohan at 2011-03-08 21:50:56

30. fine ..........
View Tutorial          By: rajesh at 2011-03-21 02:34:54

31. Really nice explanation...
nice to understa

View Tutorial          By: Parth Kansara at 2011-06-21 02:11:52

32. thnx
View Tutorial          By: Prakash at 2011-07-27 03:05:17

33. NICE.,
VERY HELPFUL.,

View Tutorial          By: siva at 2011-08-19 13:47:39

34. awesome...very good illustration
View Tutorial          By: dynamite at 2011-08-20 10:24:38

35. Excellent...
Great explanation...

View Tutorial          By: Dhaval Patel at 2011-09-04 06:49:12

36. I have initialized a int array while declaring.
View Tutorial          By: Prashanth at 2011-09-15 11:16:40

37. ans to 23:
by using gdb(GNU deb

View Tutorial          By: Bhargav at 2011-11-02 13:23:51

38. Out of -1, 0, and 1 which one can I use as second
View Tutorial          By: Sanjay Bhosale at 2011-12-06 13:17:54

39. To 25
void *memset( void *buffer, int ch, s

View Tutorial          By: Doniv at 2011-12-15 10:10:52

40. I did not get the same result for memcpy - e and f
View Tutorial          By: dml at 2012-01-02 13:32:20

41. very useful...!
View Tutorial          By: mahesh at 2012-01-06 09:55:59

42. hello it wrong in memmove nd memcpy case. I am get
View Tutorial          By: jaya at 2012-04-05 17:18:14

43. very nice..!
View Tutorial          By: neeraj at 2012-04-21 11:12:08

44. Nice Explanation.....
View Tutorial          By: Vinoth at 2012-06-20 09:37:21

45. Excellent !!!
Never thought about it...

View Tutorial          By: RahulC at 2012-07-03 11:36:57

46. Does memmove care if the source is bytes and the d
View Tutorial          By: Paul at 2012-07-20 11:59:32

47. Really nice tutorial for memset(), memcopy() and m
View Tutorial          By: Hitesh Kumar at 2012-09-03 09:16:32

48. Hi,
Very Nice explanation ,I tried both mem

View Tutorial          By: Harsh Verma at 2013-01-30 13:43:05

49. awesome.........
View Tutorial          By: tar at 2013-03-14 07:36:56

50. thumbs up!
View Tutorial          By: huang at 2013-03-28 04:02:33

51. Well explained. Example clear out the diff
View Tutorial          By: sonam at 2014-06-25 19:05:20

52. my requirement is i have a source string as src{&q
View Tutorial          By: Anil at 2014-10-27 08:36:23

53. What happens if applied to an integer array?
View Tutorial          By: SHUVO at 2015-07-01 21:14:16

54. Thanks...
View Tutorial          By: SHUVO at 2015-07-01 21:20:47

55. Excellent! Thanks.
View Tutorial          By: Swee at 2015-11-17 09:13:12

56. Thanks a lot! It is really clear ^^
View Tutorial          By: yello at 2015-11-24 17:17:07