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 arr2[20] = { 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 arr2[20] = { 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 arr[10] = { 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 函数是通过返回值告知⼤⼩关系的

相关推荐
虾球xz9 分钟前
CppCon 2018 学习:THE MOST VALUABLE VALUES
开发语言·c++·学习
阿蒙Amon1 小时前
C#扩展方法全解析:给现有类型插上翅膀的魔法
开发语言·c#
尘浮7281 小时前
60天python训练计划----day59
开发语言·python
Chef_Chen2 小时前
从0开始学习R语言--Day39--Spearman 秩相关
开发语言·学习·r语言
不学会Ⅳ2 小时前
Mac M芯片搭建jdk源码环境(jdk24)
java·开发语言·macos
好开心啊没烦恼3 小时前
Python 数据分析:计算,分组统计1,df.groupby()。听故事学知识点怎么这么容易?
开发语言·python·数据挖掘·数据分析·pandas
lljss20204 小时前
Python11中创建虚拟环境、安装 TensorFlow
开发语言·python·tensorflow
Python×CATIA工业智造7 小时前
Frida RPC高级应用:动态模拟执行Android so文件实战指南
开发语言·python·pycharm
我叫小白菜8 小时前
【Java_EE】单例模式、阻塞队列、线程池、定时器
java·开发语言
森焱森8 小时前
水下航行器外形分类详解
c语言·单片机·算法·架构·无人机