記憶體操作函式:memcpy函式,memove函式

語言: CN / TW / HK

1.memcpy函式(記憶體拷貝)

(1)memcpy函式的說明

在這裡插入圖片描述
• 函式memcpy從source的位置開始向後複製num個位元組的資料到destination的記憶體位置。
• 這個函式在遇到 ‘\0’ 的時候並不會停下來。
• 如果source和destination有任何的重疊,複製的結果都是未定義的



注意:• memcpy函式有返回值
• void可以滿足任意型別的指標
• 因為傳進來的資料型別不確定,將傳進來的資料強轉為char
,實現一個位元組一個位元組拷貝
• sizeof計算需要拷貝的位元組數


(2)memcpy的使用

a.程式碼

#include<stdio.h>
#include<string.h>
int main()
{
   
   
	char S1[20];
	char S2[] = "abcd";
	memcpy(S1, S2, sizeof(S2));
	return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
   
   
	char S1[20];
	char S2[] = "abcd";
	memcpy(S1, S2, sizeof(S2));
	double S3[20];
	double S4[] = {
   
   1.1,2.2,3.3,4.4,5.5};
	memcpy(S3, S4, sizeof(S4));
	return 0;
}

b.結果

在這裡插入圖片描述
在這裡插入圖片描述

(3)memcpy的模擬實現

a.程式碼

#include<stdio.h>
#include<string.h>
void* my_memcpy(void* dst, const void* src, size_t num)
{
   
   
	char* ch_dst = (char*)dst;
	const char* ch_src = (const char*)src;
	for (size_t i = 0; i < num; ++i)
	{
   
   
		ch_dst[i] = ch_src[i];
	}
	return dst;
}
int main()
{
   
   
	char S1[20];
	char S2[] = "abcd";
	my_memcpy(S1, S2, sizeof(S2));
	double S3[20];
	double S4[] = {
   
   1.1,2.2,3.3,4.4,5.5};
	my_memcpy(S3, S4, sizeof(S4));
	return 0;
}

b.結果

在這裡插入圖片描述

2.memmove函式

(1)memmove函式的說明

在這裡插入圖片描述
• memmove也是記憶體拷貝,可以解決記憶體重疊問題


• 和memcpy的差別就是memmove函式處理的源記憶體塊和目標記憶體塊是可以重疊的。
• 如果源空間和目標空間出現重疊,就得使用memmove函式處理。

(2)記憶體重疊問題

即dst在src的記憶體範圍之內就會出現重疊問題

a.分析

在這裡插入圖片描述

b.程式碼說明

#include<stdio.h>
#include<string.h>
int main()
{
   
   
	int a[10] = {
   
    1, 2, 3, 4, 5 };
	memcpy(a + 4, a, 20);
	return 0;
}

在這裡插入圖片描述

(3)記憶體重疊問題的解決分析

在這裡插入圖片描述

在這裡插入圖片描述

如果不重疊:隨便拷貝

(4)memmove的使用

#include<stdio.h>
#include<string.h>
int main()
{
   
   
	int a[10] = {
   
    1, 2, 3, 4, 5 };
	memmove(a + 4, a, 20);
	return 0;
}

在這裡插入圖片描述

(5)模擬實現memmove

#include<stdio.h>
#include<string.h>
void* my_memmove(void* dst, const void* src, size_t num)
{
   
   
		char* ch_dst = (char*)dst;
		const char* ch_src = (const char*)src;
		//從後往前拷
		if (ch_dst >= src && ch_dst <= ch_src + num)
		{
   
   
			for (int i = num - 1; i >= 0; --i)
			{
   
   
				ch_dst[i] = ch_src[i];
			}
		}
		//從後往前拷
		else
		{
   
   
			for (int i = 0; i < num; ++i)
			{
   
   
				ch_dst[i] = ch_src[i];
			}
		}
		return dst;
}
int main()
{
   
   
	int a[10] = {
   
    1, 2, 3, 4, 5 };
	my_memmove(a + 4, a, 20);
	return 0;
}

在這裡插入圖片描述