已有代码在linux-gcc中编译通过
1 #include <stdio.h>
2 #include <assert.h>
3 #include <string.h>
4 #include <stdlib.h>
5
6 // 内存copy函数
7 void *my_memcpy(void *dest, const void *src, int n)
8 {
9 assert((NULL != dest) && (NULL != src)); //判断指针的有效性
10 char *pdest = (char *)dest;
11 char *psrc = (char *)src; //转换成char类型,一个字节一个字节的传输
12 while(n--)
13 *pdest++ = *psrc++; //每次传输一字节
14 return pdest;
15 }
16
17 /**
18 * memcpy在内存没有重复的情况下能够正确复制,若有重叠情况则复制结果错误,但是它的效率比memmove高。
19 * 所以,在确定没有重复的情况下用memcpy,在不确定是否有内存重复的情况用memmove。
20 */
21 void *my_memmove(void *dest, const void *src, int n)
22 {
23 assert((NULL != dest) && (NULL != src));
24 char *pdest = (char *)dest; //转换成char类型,一个字节一个字节的传输
25 char *psrc = (char *)src;
26 if((pdest <= psrc) || (pdest >= psrc + n)) //从前往后复制,则不会出现覆盖src中没有复制的内容
27 {
28 while(n--)
29 *pdest++ = *psrc++;
30 }
31 else
32 {
33 pdest = pdest + n -1; //有内存重叠时,从高字节开始传输
34 psrc = psrc + n -1; //移动到末尾
35 while(n--)
36 *pdest-- = *psrc--; //每次移动一个字节
37 }
38 return pdest;
39 }
40
41 // 作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。
42 void *my_memset(void *s, int c, int n)
43 {
44 assert(NULL != s);
45 unsigned char *buff = (char *)s;
46 while(n--)
47 {
48 *(buff++) = (char)c;
49 }
50 return buff;
51 }
52
53 /** memcmp函数会逐字节比较s1和s2所指内存区,
54 * s1 > s2 —-> 返回 >0 的值
55 * s1 = s2 —-> 返回 =0 的值
56 * s1 < s2 —-> 返回 <0 的值
57 */
58 int my_memcmp(const void *s1, const void *s2, int n)
59 {
60 assert((NULL != s1) && (NULL != s2));
61
62 int result;
63 while(!(result = *(unsigned char *)s1 - *(unsigned char *)s2) && (n--))
64 {
65 s1++; s2++;
66 }
67 return result;
68
69 }
70
71 // 当第一次遇到字符c时停止查找。如果成功,返回指向字符c的指针;否则返回NULL。
72 void *my_memchr(const void *s, int c, int n)
73 {
74 assert(NULL != s);
75 int result;
76 while((*(unsigned char *)(s) != (unsigned char)c) && (n--))
77 {
78 s++;
79 }
80 return (n ? (void *)s : NULL);
81 }
82
83 char *my_strcpy(char *dest, const char *src)
84 {
85 assert((NULL != dest) && (NULL != src));//判断指针的有效性
86 char *addr = dest;
87 while((*dest++ = *src++) != '