1. 程式人生 > >C語言記憶體操作函式的實現

C語言記憶體操作函式的實現

>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函式處理。

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;
}
>memcmp:
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;
}