C语言笔记12:C语言内存函数

文章目录

C语言笔记12:C语言内存函数

一、memcpy使用和模拟实现

函数声明:

c 复制代码
void *memcpy(void* destination ,const void* source ,size_t num);

与strcpy不同的是,memcpy遇到\0不会停下来

目标空间和源空间有重叠的情况是未定义的
使用:

c 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
	int arr1[] = {1,2,3,4,5,6,7,8,9,10};
	int arr2[10] = {0};
	memcpy(arr2,arr1,20);
	for(int i = 0;i < 10;i++)
	{
		printf("%d\n",arr2[i]);
	}
	return 0;
}

输出:

c 复制代码
1 2 3 4 5 0 0 0 0 0

模拟实现:

c 复制代码
void* memcpy(void* destination ,const void* source ,size_t num)
{
	void* ret = destination;
	assert(destination != NULL);
	assert(source != NULL);
	
	while(num--)
	{
		*(char*)destination = *(char*)source;
		destination = (char*)destination + 1;//这个写法?(char*)destination 是一个右值不能直接 += 1!!!
		source = (char*)source + 1;
	}
   return ret;
}

二、memmove的使用和模拟实现

函数声明:

c 复制代码
void* memmove(void* destination ,const void* source ,size_t num);

memmove和memcpy的区别在于:

  • memmove可以处理目的空间和源空间有重叠的情况。
    使用:
c 复制代码
#include <stdio.h>

int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	
	memmove(arr+2,arr,20);
	for(int i = 0;i < 10;i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
	
	return 0;
}

结果:


模拟实现:

c 复制代码
void* memmove(void* dest ,const void* source ,size_t num)
{
	void* ret = dest;
	//判断需不需要特殊处理
	if(dest < source || dest >= source + num)
	{
		while(num--)
		{
			*(char*)dest = *(char*)source;
			dest = (char*)dest + 1;
			source = (char*)source + 1;
		}
	}
	else
	{	
		dest = (char*)dest + num - 1;
		source = (char*)source + num - 1;
		while(num--)
		{
			*(char*)dest = *(char*)source;
			dest = (char*)dest - 1;
			source = (char*)source - 1;
		}
	}
	return ret;
}

三、memset函数的使用

函数声明:

c 复制代码
void* memset(void* ptr ,int value ,size_t num);

函数使用:

c 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
	char str[] = "hello world";
	memset(str,'x',5);
	printf("%s\n",str);
	
	return 0;
}

四、memcmp函数的使用

函数声明:

c 复制代码
int memcmp(const void* ptr1, const void* ptr2, size_t num);

memcmp函数和strncmp的区别是,strncmp会遇到\0停止而memcmp不会
使用:

c 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
	char buffer1[] = "Hello I am Li";
	char buffer2[] = "Hello I am GG";
	
	int ret = memcmp(buffer1,buffer2,sizeof(buffer1));//这里使用sizeof,如果是strncmp就用strlen
	if(ret > 0)
		printf("%s > %s\n",buffer1,buffer2);
		
	return 0;
}

结果:


内存函数和字符串函数的区别大致都在于\0,以及内存函数都带有size_t num这个参数,因为它不是对字符串操作,没有默认的终止位置。

相关推荐
启观川7 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸7 小时前
排序算法介绍
python·算法·排序算法
一木 之林7 小时前
Dify学习笔记 01 · 平台入门与实战:部署、五类应用、RAG与MCP(第1-16集)
人工智能·笔记·学习·计算机视觉
weixin_448119948 小时前
Datawhale Easy Data × AI:构建知识与记忆驱动的 Agent笔记8
人工智能·笔记·react.js
动词ing8 小时前
【题目练习】算法 组合总和||
算法
wuminyu8 小时前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
陈年老古董8 小时前
Hive 函数学习笔记(下):窗口函数与经典案例
hive·笔记·学习
longlongzihan8 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
专业程序开发源8 小时前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
Logic1019 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法