C语言王国——内存函数

2024-06-08 1341阅读

目录

1 memcpy函数

1.1 函数表达式

1.2 函数模拟

2 memmove函数 

2.1 函数的表达式

2.2 函数模拟 

3 memset函数

3.1 函数的表达式

3.2 函数的运用

4 memcmp函数

4.1函数的表达式:

4.2 函数的运用

5 结论

接上回我们讲了C语言的字符和字符串函数,今天也由姜糖来给大家分享一下C语言的内存函数吧!

1 memcpy函数

1.1 函数表达式

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

此函数是将source变量中num个字节赋值给destination

注意

  • 需包含头文件string
  • 遇到'\0'不会停下
  • 如果source和destination有任何重叠,复制的结果都是未定义的。

    1.2 函数模拟

    原理函数memcpy从cource的位置开始向后复制num个字节的数据到destination指向的内存位置

    void* memcpy(void* destination, const void* source, size_t num)
    {
    	assert(destination && source);//断言是否为空指针
    	char* ret = destination;//记录改变前的地址,以防丢失
    	while (num--)
    	{
    		*(char*)destination = *(char*)source;//因为是字节的改变所以强转为char*
    		destination = (char*)destination + 1;
    		source = (char*)source + 1;
    	}
    	return ret;
    }
    int main()
    {
    	int arr[] = { 1,2,3,4,5,6 };
    	int arr1[10] = { 0 };
    	memcpy(arr, arr1, 12);
    	int i;
    	for (i = 0; i  
    

    注意:

    1. 使用void*指针进行间接引用时,必须先将其转换为实际类型的指针。这里是改变字节,所以使用时改为char*。
    2. 重叠的就交给memmove处理。


    2 memmove函数 

    2.1 函数的表达式

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

    *包含头文件string

    用来处理memcpy处理不了的堆叠问题。

    那什么是堆叠问题呢?

    如果destination为source+1,num为12则,当source中的1赋值到destination上的2时,就导致了source中的2也变成了1,导致拷贝结果不对,这就是堆叠。

    C语言王国——内存函数

    那堆叠该怎么解决呢?

    在memcpy中我们使用的是从前往后拷贝,但是这里不行,所以我们使用从前往后拷贝,在数字被改变之前就完成拷贝的步骤。那是否从后往前拷贝就能解决所有问题呢?答案是不行的,比如:

    C语言王国——内存函数

    如图,在arr数组上面将蓝色拷贝给黄色就会出错,所有我们在编写memmove中应该分类讨论。

    那具体该怎么分类呢?

    C语言王国——内存函数

    同样如图所示,设蓝色为source,若黄色首地址在蓝色前面则,从后往前拷贝;反之则从前往后。

    2.2 函数模拟 

    #include
    #include
    void* memmove(void* destination, const void* source, size_t num)
    {
    	assert(destination && source);
    	char* ret = destination;
    	if (destination  
    

    有些人可能会有疑惑,好像memcpy能干的,memmove能干,memcpy不能干的事,memcove也能干,那为什么存在memcpy呢?

    memcpy()函数的实现相对于memmove()函数来说更简单、更高效。因为memcpy()不考虑内存重叠的情况,所以它在处理非重叠内存区域的数据复制时更快。而memmove()函数需要先判断内存区域是否重叠,再决定如何进行数据复制,所以相对来说会慢一些。

    所以,当你确定要进行的数据复制操作不会涉及到内存重叠的情况时,可以选择使用memcpy()函数。而当你不能确定内存是否重叠,或者确实需要处理内存重叠的情况时,可以使用memmove()函数来确保正确的复制结果。

    总而言之,memcpy()和memmove()都有各自的应用场景,你可以根据实际需求选择合适的函数。

    姜糖也只能说存在即合理,其实如果想偷懒都用memmove就行啦。


    3 memset函数

    3.1 函数的表达式

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

    此函数是将内存中的值以字节为单位设置成想要的内容。

    包含头文件string。

    3.2 函数的运用

    #include
    #include
    int main()
    {
    	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    	memset(arr, 0, 40);//将数组全部归0
    	int i;
    	for (i = 0; i  
    

    输出结果为:

    C语言王国——内存函数


    4 memcmp函数

    4.1函数的表达式:

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

    比较ptr1和ptr2指针指向的位置开始,向后num个字节。

    包含头文件string。

    此函数和strncmp原理大致相同。

    4.2 函数的运用

    #include
    #include
    int mian()
    {
    	char str1[] = "hello world";
    	char str[] = "helloworld";
    	int ret = memcmp(str1, str, 6);
    	if (ret)
    	{
    		printf("前6个一样");
    	}
    	else
    		printf("前6个不一样");
    	return 0;
    }

    输出结果:

    C语言王国——内存函数


    5 结论

    最后两个函数的模拟姜糖改为了函数的运用,意在让大家自己开动脑筋结合本文和前文的字符串函数的模拟自己去完成,因为他们都有异曲同工之妙。

    接下来有什么问题可以私信姜糖哦。也希望大家能一键三连,谢谢大家了。最后就让我们一起进步吧!

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]