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 函数是通过返回值告知⼤⼩关系的

相关推荐
Evand J3 分钟前
【MATLAB例程】线性卡尔曼滤波的程序,三维状态量和观测量,较为简单,可用于理解多维KF,附代码下载链接
开发语言·matlab
苕皮蓝牙土豆16 分钟前
C++ map容器: 插入操作
开发语言·c++
Dxy123931021622 分钟前
Python 装饰器详解
开发语言·python
linab11229 分钟前
mybatis中的resultMap的association及collectio的使用
java·开发语言·mybatis
NaclarbCSDN1 小时前
Java IO框架
开发语言·python
fanTuanye1 小时前
Java基础知识总结(超详细整理)
java·开发语言
顾子茵1 小时前
c++从入门到精通(六)--特殊工具与技术-完结篇
android·开发语言·c++
孞㐑¥1 小时前
Linux之基础IO
linux·开发语言·c++·经验分享·笔记
进取星辰1 小时前
31、魔法生物图鉴——React 19 Web Workers
开发语言·javascript·ecmascript
mahuifa1 小时前
ubuntu18.04编译qt5.14.2源码
开发语言·数据库·qt