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这个参数,因为它不是对字符串操作,没有默认的终止位置。

相关推荐
江畔柳前堤6 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
wuyk5556 小时前
第2章:六步换相原理全解+STM32工程实战
c语言·开发语言·stm32·单片机·嵌入式硬件
Forever Nore7 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考8 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
GlueNa2SiO39 小时前
第十八章 Linux故障排查与恢复
linux·服务器·笔记·学习
蛋先生DX9 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面10 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号10 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
xian_wwq10 小时前
【学习笔记】Context Engineering,AI Agent 真正的内存管理-4/16
笔记·学习·context
月光船幽幽10 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法