C語言記憶體操作函式的實現
阿新 • • 發佈:2019-02-15
>memcpy:
void *memcpy(void *dest,const void *source,size_t num);
(1)函式memcpy從source的位置開始向後複製num個位元組的資料到dest的記憶體位置。
(2)這個函式在遇到'\0'的時候並不會停下來。
(3)如果source和dest有任何的重疊,複製的結果都是未定義的。
void *my_memcpy(void *dest, const void *str, int size) { assert(dest); assert(str); assert(size > 0); while (size--){ *(char *)dest = *(char *)str; (char *)dest = (char *)dest + 1; (char *)str = (char *)str + 1; } return dest; }
適用於dest>source,如果dest<source就會記憶體從疊問題,從前往後拷貝時前一個會把後一個覆蓋num個位元組。這時就需要用到memmove。
>memmove:
void *memmove (void *dest,const char *str,int size);
(1)和memmove的差別就是memmove函式處理的源記憶體塊的目標記憶體塊是可以重疊的。
(2)如果源空間和目標空間出現重疊,就得使用memmove函式處理。
>memcmp:void *my_memmove(void *dest, const void *str, int size) { assert(dest); assert(str); assert(size > 0); if (dest <=str || (char *)dest >= (char *)str + size){ while (size--){ *(char *)dest = *(char *)str; (char *)dest = (char *)dest + 1; (char *)str = (char *)str + 1; } } else { dest = (char *)dest + size - 1; //指標指向陣列結尾 str = (char *)str + size - 1; while (size--){ *(char *)dest = *(char *)str; (char *)dest = (char *)dest- 1; (char *)str = (char *)str- 1; } } return dest; }
int memcmp(const void *str1,const void *str2,size_t num);
比較從str1和str2指標開始的num個位元組。
int my_memcmp(const void *str1, const void *str2, int size) { assert(str1); assert(str2); assert(size>0); int ret = 0; while (size&&(!(ret=*(unsigned char *)str1-*(unsigned char *)str2))&&(*(char *)str1)){ (char *)str1 = (char *)str1+1; (char *)str2 = (char *)str2+1; size--; } if (ret > 0) printf("str1>str2\n"); else if(ret<0) printf("str1<str2\n"); return ret; }
>memchr:
void *memchr(const void *dest,int c,size_t count);
從dest區域所指記憶體的前count開始查詢字元c。
void *my_memchr(const void *dest, int c, int size)
{
assert(dest);
assert(size>0);
while (size&&*(char *)dest){
if (*(char *)dest ==(char)c)
return (char *)dest;
dest = (char *)dest + 1;
size--;
}
return 0;
}