C语言----内存函数

news/2024/7/27 19:10:52

内存函数主要用于动态分配和管理内存,它直接从指针的方位上进行操作,可以实现字节单位的操作。

其包含的头文件都是:string.h

memcpy

copy block of memory的缩写----拷贝内存块

格式:

void *memcpy(void *dest, const void *src, size_t num);

作用:与strcpy类似,但是从内存的角度从source的位置开始向后复制num个字节的数据到destination指向的内存位置。

要求:

• 这个函数在遇到 '\0' 的时候并不会停下来。也就是说如果在数据中间插入 ‘\0’ 是不会停下复制进程的。

• 如果source和destination有任何的重叠,复制的结果都是未定义的。

• 鉴于拷贝的类型不一,使用*void来表示任意类型。

• num的单位是字节

实例:

int main()
{char arr1[20] = "hello world";char arr2[20] ;memcpy(arr2, arr1,strlen(arr1)+1);//需要复制的字节数为arr1的长度加上字符串结束符'\0'printf("%s", arr2);return 0;
}

 

int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };//将arr1中的4 5 6 7 8,拷贝到arr2中memcpy(arr2, arr1+3, 5 * sizeof(int));//可以拷贝数组中的任意数据int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

模拟实现:

void* my_memcpy(void* dest, const void* src, size_t num)
{void* ret = dest;while (num--)//根据所要复制的字节数进行递减直到复制完成{assert(dest && src);*(char*)dest = *(char*)src;dest = (char*)dest+1;src = (char*)src + 1;}return (ret);
}

memmove

move block of memory的缩写----内存体转移

格式

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

作用与要求

和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。由于该特性,实际上memmove比memcpy更加实用,兼容性也更强。

实例:

int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1 + 2, arr1, 20);//20个字节就是五个整型,在这里arr1+2也就是从3开始拷贝1,2,3,4,5五个数字int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}//打印出的结果是1,2,1,2,3,4,5,8,9,10(因为arr1的空间只够放下十个整型,并且mommove是允许重叠内存空间的)

模拟实现:

void* my_memmove(void* dest, const void* src, size_t n) 
{unsigned char* d = (unsigned char*)dest;const unsigned char* s = (const unsigned char*)src;if (s < d && s + n > d) {// 如果源地址在目标地址之前且重叠for (size_t i = n; i > 0; i--) {d[i - 1] = s[i - 1];}} else {// 普通情况下的复制for (size_t i = 0; i < n; i++) {d[i] = s[i];}}return dest;
}

memset

set block of memory的缩写----填充设置内存块

格式

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

作用:memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。同时在重叠内存空间时实现覆盖原内容。

要求:

• 使用memset函数时需要谨慎,确保不会意外覆盖原有的数据。

实例:

int main() 
{char str[] = "almost every programmer should know memset!";memset(str, '-', 6);printf(str)return 0;
}//结果是 ------ every programmer should know memset!
//也就是说将almost覆盖

模拟实现:

void* my_memset(void* ptr, int value, size_t num) 
{unsigned char* p = (unsigned char*)ptr;for (size_t i = 0; i < num; i++) {p[i] = (unsigned char)value;}return ptr;
}

memcmp

compare block of memory的缩写----比较内存块

作用:与strcmp类似,⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节,参照下表:

注意:同strcmp不同的是,memcmp可以比较内存区域的大小,具体参照下方实例。

实例:

int main()
{char ned1[] = "dsdsdssdds1";char ned2[] = "dsdsdssdds2";int n;n = memcmp(ned1, ned2, 44);printf("%d", n);return 0;
}

模拟实现:

int my_memcmp(const void* ptr1, const void* ptr2, size_t num)
{//比较内存区域大小const unsigned char* p1 = (const unsigned char*)ptr1;const unsigned char* p2 = (const unsigned char*)ptr2;for (size_t i = 0; i < num; i++) {if (p1[i] < p2[i]) return -1;if (p1[i] > p2[i]) return 1;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/8248.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯电子类单片机提升三——NE555

目录 单片机资源数据包_2023 一、NE555和定时器工作模式 1.NE555的介绍 2.定时器的计数模式 二、NE555频率读取代码的实现 1.定时器0初始化 2.通过读取TH0和TL0来读取频率 3.通过中断读取频率 三、完整代码演示 通过读取TH0和TL0来读取频率 main.c 通过中断读取频…

LabVIEW智能温度监控系统

LabVIEW智能温度监控系统 介绍了一个基于LabVIEW的智能温度监控系统&#xff0c;实现对工业环境中温度的实时监控与调控。通过集成传感器技术和LabVIEW软件平台&#xff0c;系统能够自动检测环境温度&#xff0c;及时响应温度变化&#xff0c;并通过图形用户界面(GUI)为用户提…

改进神经网络

Improve NN 文章目录 Improve NNtrain/dev/test setBias/Variancebasic recipeRegularizationLogistic RegressionNeural networkother ways optimization problemNormalizing inputsvanishing/exploding gradientsweight initializegradient checkNumerical approximationgrad…

【Linux】初步使用makefile

makefile 1 快速使用1.1 认识makefile1.2 使用makefile 2 深入理解理解 **依赖关系 与 依赖方法**如何实现源代码修改了才会重新编译 3 内置符号理解Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&#xff01;&a…

勒索病毒最新变种.faust勒索病毒来袭,如何恢复受感染的数据?

引言&#xff1a; 随着我们进入数字化时代&#xff0c;数据的重要性变得愈发显著&#xff0c;而网络安全威胁也日益增加。.faust勒索病毒是其中一种备受恶意分子钟爱的危险工具&#xff0c;它通过加密用户文件并勒索高额赎金来对个人和组织发起攻击。本文将深入探讨.faust勒索…

【python--迭代生成器闭包面向对象继承多态】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;深度学习 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; python--迭代生成器闭包面向对象继承多态 往期内容1.迭代for...in字典的迭代列表迭代 生成器推导式的…