內存操作函數:memcpy函數,memove函數

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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章