【C语言】memcpy,memmove,memcmp,memset函数详解

这篇具有很好参考价值的文章主要介绍了【C语言】memcpy,memmove,memcmp,memset函数详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C语言】memcpy,memmove,memcmp,memset函数详解,c语言,开发语言

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

🌸memcpy函数

#include<string.h>

一、 memcpy函数的定义:

void * memcpy ( void * destination, const void * source, size_t num );

与strncmp区别是:参数方面:1.memcpy可以拷贝任意类型数据;2.num是字节数

二、memcpy函数的功能:

复制内存块
将字节数的值从源指向的位置直接复制到目标指向的内存块。

源指针和目标指针指向的对象的基础类型与此函数无关;结果是数据的二进制副本。

该函数不检查源中的任何终止空字符它总是==准确地复制字节数。

为避免溢出,目标和源参数指向的数组大小应至少为字节数,并且不应重叠(对于重叠的内存块,memmove 是一种更安全的方法)

三、memcpy函数模拟

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, void* src, size_t num)
{
	void* ret = dest;
	assert(dest);
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;

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

【C语言】memcpy,memmove,memcmp,memset函数详解,c语言,开发语言

memcpy注意事项

1.函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
2.这个函数在遇到 '\0' 的时候并不会停下来
3.如果source和destination有任何的重叠,复制的结果都是未定义的。
原因也很简单:如下代码

int arr1[] = { 0,1,2,3,4,5,6,7,8,9 };
	my_memcpy(arr1+2, arr1, 40);

给自己复制时,肯定时一位一位复制,把arr1[0]复制到arr+2(arr[2])位置时,arr1【2】的数值被覆盖为0,那么当我们继续复制时再取出arr[2]的值就是你之前已经复制过的了0,而不是原本的数值2,就不再是你想要复制的数据了。
4.

my_memcpy(arr2, arr1, 9);

这里我只复制前9个字节,可以发现打印出来了0,1,2.这是为什那么呢?
原因是:我们的vs编译器是小端存储(即,数据低位存到内存的高地址),
1,2,3在内存中的二进制存储为:
01 00 00 00|02 00 00 00|03 00 00 00 【一个00也就是一字节】
存储就9字节,正好把3 的关键位给复制进去了。
【C语言】memcpy,memmove,memcmp,memset函数详解,c语言,开发语言

💭memmove函数

#include<string.h>

一、memmove函数简介

void * memmove ( void * destination, const void * source, size_t num );

参数与memcpy一样
与memcpy函数区别是,它通常被用在源空间和目标空间出现重叠时

二、memmove函数的模拟

1.两种情况

memomove复制时,有两种情况
1.dest地址<src地址: 从前到后(左到右)
2.dest地址>src地址: 从后到前(右到左)
【C语言】memcpy,memmove,memcmp,memset函数详解,c语言,开发语言

2模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, void* src, size_t num)
{
	void* ret = dest;//保存初始位置地址
	assert(dest);//确保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);
			//先强制转换成char型,再加上num个字节。
			//就是指向src,dest的末尾元素
		}
	}
	return ret;

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

【C语言】memcpy,memmove,memcmp,memset函数详解,c语言,开发语言

💭memcmp函数

#include<string.h>

1.memecmp函数介绍

1.1定义

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

参数:ptr1和ptr2都指向内存块的指针。
num:要比较的字节数
返回值:
返回一个整数值,该值指示内存块内容之间的关系:

返回值 表明
小于0 ptr2大(指向的第一个不相等字符块)
0 两个内存块的内容相等
大于0 ptr1大

1.2.功能

将 ptr1 指向的内存块的前 num 字节数与 ptr2 指向的第一个字节数进行比较,
如果它们都匹配,则返回零,
如果不匹配,则返回一个不同于零的值,表示哪个值更大。 请注意,与 strcmp 不同,该函数在找到空字符后不会停止比较。

✨memset函数

#include<string.h>

1.memset函数介绍

void * memset ( void * ptr, int value, size_t num );

参数: ptr;指向要填充的内存块的指针。
value:要设置的值。该值作为 int 传递,但该函数使用此值的无符号 char 转换填充内存块。
num:字节数
返回值:修改后的ptr

2.memset功能

3.memset使用

案例一:

#include<string.h>
int main()
{
	int arr[10] = { 0 };
	memset(arr, 1, 20);
	return 0;
 }

【C语言】memcpy,memmove,memcmp,memset函数详解,c语言,开发语言
它是将每一个字节都赋值成1;
案例二:

#include<string.h>
int main()
{
	char arr[10] = { "hellloni"};
	memset(arr, 'x', 5);
	printf("%s", arr);
	return 0;
 }
 

【C语言】memcpy,memmove,memcmp,memset函数详解,c语言,开发语言文章来源地址https://www.toymoban.com/news/detail-581981.html

到了这里,关于【C语言】memcpy,memmove,memcmp,memset函数详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言内存操作函数,memcpy的使用和模拟实现,memmove的使用和模拟实现,memcmp的使用,memset的使用。

    函数原型: void *dest 目标数据首元素地址 const void *src 源数据(需要拷贝过去的数据) size_t count 需要拷贝数据的字节大小 void *memcpy 拷贝结束后,返回目标数据的起始地址 函数作用: 拷贝 count 个字节的数据从源数据起始地址到目标空间。 函数的使用 函数的模拟实现: 注:

    2024年02月09日
    浏览(43)
  • C语言内存函数(memcpy、memmove、memcmp)详解

    memcpy函数为内存拷贝函数,既可以拷贝字符串,也可以拷贝整形数组、浮点型数组等,具有明显的应用优势, destination为目的地空间,source为不可修改(const)的来源空间,num表示无符号的字节数。其主要含义为将source内容拷贝到destination中,拷贝num个字节数。其返回类型、目

    2024年02月07日
    浏览(31)
  • 【C语言内存函数精选】memcpy、memset、memmove及仿真实现!掌握内存操作的艺术!

    ❤️ 博客主页: 小镇敲码人 🍏 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌞 任尔江湖满血骨,我自踏雪寻梅香。 万千浮云遮碧月,独傲天下百坚强。 男儿应有龙腾志,盖世一意转洪荒。 莫使此生无痕度,终归人间一捧黄。🍎🍎🍎 ❤️ 我的努力求学没有得到别的好处,只

    2024年02月15日
    浏览(37)
  • 【C语言】内存函数memcpy和memmove的功能与模拟实现

    1.memcpy 功能:把source指向的前num个字节内容拷贝到destination指向的位置去,可以拷贝任意类型的数据。 注:1.memcpy并不关心\\0,毕竟传的也不一定是字符串,因此拷贝过程中遇到\\0也不会停下来。 2.num的单位是字节,并不是要拷贝的元素个数 3.如果source和destination有任何的重叠

    2024年02月19日
    浏览(39)
  • C语言—模拟实现memcpy,memmove

    函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。 这个函数在遇到 \\\'\\0\\\' 的时候并不会停下来。 如果source和destination有任何的重叠,复制的结果都是未定义的。 其实要实现memcpy非常的简单,我们不管传进来的是哪种数据类型都统一强转为char*,我们知

    2024年02月15日
    浏览(35)
  • 提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove

    strlen函数的作用就是求字符串的首元素开始往后计算字符串的长度,直到’\\0‘,但不会把\\0的长度计算进去 strncpy的作用就是从source指向的字符串复制num个字节的内容到destination指向的字符串去 如果source的长度小于num,则填充0 注意source和destination的内容在空间上不要重叠,如

    2024年02月16日
    浏览(43)
  • 【C语言】memmove()函数(拷贝重叠内存块函数详解)

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022 目录  一.memmove()函数简介 1.函数功能 2.函数参数 1.void * destination 2.onst void * source 3.size_t num 3.函数返回值 4.函数头文件 二.memmove()函数的具体使用 1.使用memmove()函数完成拷贝整型数组数据(目的地与源重

    2024年02月06日
    浏览(38)
  • memcmp函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用、自己实现函数 )

    memcmp()函数用于:比较两个内存块 函数声明:int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 参数: ptr1:指向内存块的指针。 ptr2:指向内存块的指针。 数字:要比较的字节数。 返回值: 0: 在两个内存块中不匹配的第一个字节在  ptr1  中的值低于 在 ptr2  中的值(如果计

    2023年04月09日
    浏览(61)
  • C语言与C++语言中的memset函数

    memset 是一个 C 语言库函数,它位于 string.h 头文件中。这个函数的主要作用是将一块内存区域的内容全部设置为指定的值。 memset 的原型如下: 参数说明: void *s:指向要设置的内存区域的指针。 int c:要设置的值,虽然是 int 类型,但实际上只使用了它的低 8 位(一个字节)

    2024年02月10日
    浏览(36)
  • 【C语言】memcpy()函数(内存块拷贝函数)

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022 目录 一.memcpy()函数简介 🎏函数功能 🎏函数参数 📌void * destination 📌const void * source 📌size_t num 🎏函数返回值 🎏函数头文件 二.memcpy()函数的具体使用 🎏使用memcpy()函数完成拷贝整型数组数据 🎏使

    2024年02月05日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包