c语言内存函数

123 阅读2分钟

内存函数

  • memcpy 内存拷贝函数
  • 不管里面的类型 只会拷贝一块内存
  • 目标内存 源地址 限制拷贝字节
int main()
{
	int arr[5] = { 1,2,3,4,5 };
	// 内存拷贝函数 
	int arr1[10] = { 0 };

	// 目标地址  源地址  要拷贝多少字节
	memcpy(arr1, arr, sizeof(arr));


	return 0;
}
  • 模拟实现 memcpy
void* my_memcpy(void * dest,const void * src,size_t num)
{
	void* ret = dest;
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}

int main()
{
	int arr[5] = { 1,2,3,4,5 };

	int arr1[10] = { 0 };

	// 成功
	my_memcpy(arr1, arr, sizeof(arr));

	return 0;
}
  • memmove 处理内存重叠的情况
  • 解决重叠拷贝
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

	//memmove(arr + 2, arr, 20);// 解决内存重叠
	// 1 2 1 2 3 4 5 6 7 8 9 10

	return 0;
}
  • 模拟memmove
void * my_memmove(void * dest,const void * src,size_t num)
{
	void* ret = dest;
	if (dest < src)
	{
		// 前->后
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		// 后 ->前
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

	my_memmove(arr + 2, arr, 20);// 解决内存重叠
	// 1 2 1 2 3 4 5 8 9 10

	return 0;
}
  • memcpy 只要实现了不重叠拷贝就可以了,而vs中的实现既可以拷贝不重叠,也可以拷贝重叠内存。
  • 不重叠使用 memcpy
  • 重叠使用 memmove

  • memcmp 内存比较
  • 相同返回 0
  • 第一个参数大于第二个参数 返回 1 反之 返回 -1
  • 如果第三个参数字节出现不相等的 情况 提前结束
  • 例:int 4 字节 比较 6个字节 就会提前结束
int main()
{
	float arr1[] = { 1.0,2.0,3.0,4.0 };
	float arr2[] = { 1.0,9.0,3.0,6.0,8.0 };

	int ret = memcmp(arr1, arr2, 8);
	printf("%d", ret);

	/*
		memcmp 和 strcmp 返回值一样

		相同返回 0
		第一个参数大于第二个参数 返回 1 反之 返回 -1
	*/
	return 0;
}
  • memset 内存设置
int main()
{
	// 40
	int arr[10] = { 0 };// 20

	memset(arr, 1, 20);

	// memset 以字节为单位设置内存的

	return 0;
}