c语言内存函数

目录

[1. memcpy](#1. memcpy)

[1.1 代码演示](#1.1 代码演示)

2.memove

[2.1 代码演示](#2.1 代码演示)

[2.2 模拟实现](#2.2 模拟实现)

[3. memset](#3. memset)

[3.1 代码演示](#3.1 代码演示)

[3.2 总结](#3.2 总结)

4.memcmp

[4.2 总结](#4.2 总结)


1. memcpy

void * memcpy ( void * destination, const void * source, size_t num );
功能:
memcpy 是完成内存块拷⻉的,不关注内存中存放的数据是啥
函数 memcpy 从 source 的位置开始向后复制 num 个字节的数据到 destination 指向的内存
位置。
如果 source 和 destination 有任何的重叠,复制的结果都是未定义的。
(内存重叠的情况使⽤ memmove 就⾏)
memcpy 的使⽤需要包含 <string.h>
参数:
destination :指针,指向⽬标空间,拷⻉的数据存放在这⾥
source :指针,指向源空间,要拷⻉的数据从这⾥来
num :要拷⻉的数据占据的字节数
返回值:
拷⻉完成后,返回⽬标空间的起始地址

1.1 代码演示



1.2 模拟实现

void* my_memcpy(void* dest, const void* src, size_t num)

{

void* ret = dest;

assert(dest && src);

while (num--)

{

*(char*)dest = *(char*)src;

src = (char*)src + 1;

dest = (char*)dest + 1;

}

return ret;

}

//4*3 + 3

int main()

{

/*int arr1\[\] = { 1,2,3,4,5,6,7,8,9,10 };

int arr220 = { 0 };

my_memcpy(arr2, arr1, 40);

*/

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

memcpy(arr + 2, arr, 20);

return 0;

}

2.memove

void * memmove ( void * destination, const void * source, size_t num );
功能:
memmove函数也是完成内存块拷⻉的
和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
memmove的使⽤需要包含<string.h>
参数:
destination :指针,指向⽬标空间,拷⻉的数据存放在这⾥
source :指针,指向源空间,要拷⻉的数据从这⾥来
num :要拷⻉的数据占据的字节数
返回值:
拷⻉完成后,返回⽬标空间的起始地址

2.1 代码演示

int main()

{

//内存没有重叠

int arr1\[\] = { 1,2,3,4,5,6,7,8,9,10 };

int arr220 = { 0 };

//memcpy();

memmove(arr2, arr1, 20);

return 0;

}

int main()

{

//内存重叠

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

memmove(arr+2, arr, 20);

return 0;

}

2.2 模拟实现

#include <assert.h>

void* my_memmove(void* dest, const void* src, size_t num)

{

assert(dest && src);

void* ret = dest;

if (dest < src) //1

{

//前->后

while (num--)

{

*(char*)dest = *(char*)src;

dest = (char*)dest + 1;

src = (char*)src + 1;

}

}

else //2 3

{

//后->前

while (num--)

{

*((char*)dest + num) = *((char*)src + num);

}

}

return ret;

}

int main()

{

//内存重叠

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

my_memmove(arr + 2, arr, 20);

/*my_memmove(arr, arr+2, 20);*/

return 0;

}
后 ->前

前->后

3. memset

代码块
void * memset ( void * ptr, int value, size_t num );
功能:
memset 函数是⽤来设置内存块的内容的,将内存中指定⻓度的空间设置为特定的内容。
memset 的使⽤需要包含 <string.h>
参数:
ptr :指针,指向要设置的内存空间,也就是存放了要设置的内存空间的起始地址。
value :要设置的值,函数将会把 value 值转换成 unsigned char 的数据进⾏设置的。 也就是
以字节为单位来设置内存块的。
num :要设置的内存⻓度,单位是字节。
**返回值:**返回的是要设置的内存空间的起始地址。

3.1 代码演示

int main()

{

char arr\[\] = "hello world";

memset(arr+2, 'x', 5);

printf("%s\n", arr);

return 0;

}

变化:

int main()

{

int arr10 = { 1,2,3,4,5,6,7,8,9,10 };

//能否将arr的每个元素设置为0

memset(arr, 0, 40);

return 0;

}

3.2 总结

当有⼀块内存空间需要设置内容的时候,就可以使⽤memset函数,值得注意的是memset函数对内存单元的设置是以字节为单位的。

4.memcmp

代码块
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
功能:
⽐较指定的两块内存块的内容,⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节
memcmp 的使⽤需要包含 <string.h>
参数:
ptr1 :指针,指向⼀块待⽐较的内存块
ptr2 :指针,指向另外⼀块待⽐较的内存块
num :指定的⽐较⻓度,单位是字节
返回值:

4.1 代码演示
int main()

{

int arr1\[\] = { 1,2,3,4,5,6,7,8,9,10 };

int arr2\[\] = { 1,2,3,4,8};

int r = memcmp(arr1, arr2, 17);

if (r > 0)

printf(">\n");

else if(r<0)

printf("<\n");

else

printf("==\n");

return 0;

}

4.2 总结

如果要⽐较2块内存单元的数据的⼤⼩,可以使⽤ memcmp 函数,这个函数的特点就是可以指定⽐较⻓度。
memcmp 函数是通过返回值告知⼤⼩关系的

相关推荐
Lyndon-李大鹏10 小时前
QT-VS环境
开发语言·qt
微学AI11 小时前
内网穿透的应用-把飞牛NAS变成家庭录像中心:EasyNVR部署与远程回放实战
开发语言·php
峥嵘life11 小时前
Android WiFi连接过程 wpa_supplicant 日志分析
android·开发语言·php
BerryS3N11 小时前
深度解析:从零构建生产级大模型 RAG(检索增强生成)系统全栈指南
开发语言·python·ai
今儿敲了吗11 小时前
Python——函数基础
开发语言·笔记·python
CHANG_THE_WORLD12 小时前
深入理解递归:从函数调用到调用栈的完整执行过程
java·开发语言·算法
kels889912 小时前
单连接动态增减订阅:股票行情API后端降负载实战方案
开发语言·笔记·python·信息可视化·金融
a44931536212 小时前
MacBook USB-C不充电故障诊断:从PD握手到主板供电链路
c语言·开发语言·macos·电脑
德福危险12 小时前
从目录枚举到bash破壳漏洞、从流量抓包到组权限提权:靶机练习之symfonos3
开发语言·bash
meng半颗糖13 小时前
3.Java流程控制语句
java·开发语言·intellij-idea