c语言--内存函数的使用(memcpy、memcmp、memset、memmove)

本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠情况,memset用于填充内存,memcmp用于比较内存块。每个函数的声明、参数、返回值和示例代码都有所展示。
摘要由CSDN通过智能技术生成

一、memcpy()

1.1声明

void *memcpy(void *dest, const void *src, size_t n)

1.2参数

dest – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
src – 指向要复制的数据源,类型强制转换为 void* 指针。
n – 要被复制的字节数。

1.3返回值

该函数返回一个指向目标存储区 str1 的指针。

1.4memcpy的使用

// 将字符串复制到数组 dest 中
#include<stdio.h>
#include<string.h>
int main()
{
		const char src[50] = "http://www.runoob.com";
		char dest[50]="****************";
		memcpy(dest, src, 6);// 将字符串复制到数组 dest 中
		printf("dest = %s\n", dest);
	return 0;
}

在这里插入图片描述

1.5memcpy模拟使用

#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_memcpy(char* dest, const char* src,size_t n)
{
	assert(dest && src);
	char* ret = dest;
	for (int i = 0; i < n; i++)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest+1;
		src = (char*)src+1;
	}
	return ret;
}
int main()
{
		const char src[50] = "http://www.runoob.com";
		char dest[50]="****************";
	    char* ret=my_memcpy(dest, src, 6);// memcpy模拟实现
	    printf("dest = %s\n", ret);
	    return 0;
}

在这里插入图片描述

1.6注意

函数memcpy从src的位置开始向后复制num个字节的数据到dest指向的内存位置。
这个函数在遇到 ‘\0’ 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。
对于重叠的内存可以用memmove来处理。

二、memmove()

2.1声明

void *memmove(void *str1, const void *str2, size_t n)

2.2参数

str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
n – 要被复制的字节数。

2.3返回值

该函数返回一个指向目标存储区 str1 的指针。

2.4使用

#include<stdio.h>
#include<string.h>
int main()
{
	char src[] = "http://www.runoob.com";
	char dest[50] = "**********";
	memmove(dest, src, 6);
	printf("dest=%s", memmove(dest,src,6));
	return 0;
}

2.5memmove()模拟实现

#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_memmove(char* dest, const char* src, size_t n)
{
	char* ret = dest;
	if (dest < src)
	{
		while (n--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		while (n--)
		{
			*(char*)(dest + n) = *(char*)(src + n);
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	return ret;
}
int main()
{
		const char src[50] = "http://www.runoob.com";
		char dest[50]="****************";
		char* my_memmoves=my_memmove(dest, src, 6);//memmove模拟实现
		printf("dest = %s\n", my_memmoves);
	return 0;
}

在这里插入图片描述

三、memset

3.1声明

void *memset(void *str, int c, size_t n)

3.2参数

str – 指向要填充的内存块。
c – 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
n – 要被设置为该值的字节数。

3.3返回值

该值返回一个指向存储区 str 的指针。

3.4使用

#include <stdio.h>
#include <string.h>
 
int main ()
{
   char str[50];
 
   strcpy(str,"This is string.h library function");
   puts(str);
 
   memset(str,'$',7);
   puts(str);
   
   return(0);
}
运行结果
```c
This is string.h library function
$$$$$$$ string.h library function

在这里插入图片描述

四、memcmp()

4.1声明

int memcmp(const void *str1, const void *str2, size_t n)


4.2参数

str1 -- 指向内存块的指针。
str2 -- 指向内存块的指针。
n -- 要被比较的字节数。

4.3返回值

如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str1 大于 str2。
如果返回值 = 0,则表示 str1 等于 str2

4.4使用

#include <stdio.h>
#include <string.h>

int main ()
{
   char str1[15];
   char str2[15];
   int ret;

   memcpy(str1, "abcdef", 6);
   memcpy(str2, "ABCDEF", 6);

   ret = memcmp(str1, str2, 5);

   if(ret > 0)
   {
      printf("str2 小于 str1");
   }
   else if(ret < 0) 
   {
      printf("str1 小于 str2");
   }
   else 
   {
      printf("str1 等于 str2");
   }
   
   return(0);
}

在这里插入图片描述

五、注意

他们都要包含头文件<string.h>,assert断言也需要包含头文件。
在这里插入图片描述
欧耶!!! 我学会啦!!!

  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值