C语言的内存操作函数

本文介绍了C语言中的内存操作函数,包括memcpy用于无重叠区域的复制,memmove则能处理源目标内存块的重叠情况,确保安全复制。此外,还讲解了memcmp函数,用于比较两块内存区域的内容,返回值根据比较结果决定。注意在处理字符串时,''不会影响memcpy的复制,而在memcmp中,不同字符的ASCII码值会参与比较。
摘要由CSDN通过智能技术生成
1.
memcpy();   //内存单元复制  (不可以自己给自己追加)
void * memcpy ( void * dest, const void * src, size_t num ); //目标起始地址,  要复制内存单元起始地址 , 复制的数量(单位是字节)
  • 函数memcpy从src的位置开始向后复制num个字节的数据到dest的内存位置。

  • 这个函数在遇到'\0'的时候并不会停下来。

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

头文件: memory.h 或 string.h
strcpy()只能复制字符串, memcpy()什么类型的数据都可以进行复制

 

#include <string.h>
int main()
{
         int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
         int arr2[5] = { 0 };
        memcpy(arr2, arr1, 20);
         //把arr1的20个内存单元复制给arr2 , 单位是字节
}

 


 

 2.

memmove();   //内存单元复制 (可以自己给自己追加)
void * memmove ( void * dest, const void * src, size_t num ); //目标起始地址,  要复制内存单元起始地址 , 复制的数量(单位是字节)
  • 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
#include <string.h>
int main()
{
         int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
        memmove(arr1 + 2, arr1, 20);
         //把arr1 的20个内存单元复制给 arr1+2 的位置 , 单位是字节
         return 0;
}

 

//arr1 给 arr1自己进行了复制,并且重叠

//如果是上面 模拟实现memcpy 的方法,数据会被替换, 无法实现重叠,结果会是: 12121218910 //err


 3.

memset();  //修改内存中的单元   , 单位是字节
void* memset( void* dest, int c, size_t count );  //目标起始地址,  修改内存单元的起始地址 , 修改的内存单元数量(单位是字节)
#include <string.h>
int main()
{
         int arr[] = { 0x11111111,0x22222222,3,4,5 };
        memset(arr, 0, 20);
         return 0;
}
内存单元从:

 变为:

 //没有变红的部分,也变0了,只不过本来是0,所以编译器没有变红提示


4.

memcmp(); //内存单元比较, 单位是字节
int memcmp ( const void * ptr1, const void * ptr2, size_t num );   //目标起始地址,  比较的内存单元的起始地址 , 比较的数量
  • 比较从ptr1和ptr2指针开始的num个字节
  • 返回值和strcmp一样:
    • >返回>0的值   
    • ==返回0 
    • <返回<0的值
#include <stdio.h>
#include <string.h>
int main()
{
         int arr1[] = { 1,2,3,4,5 };
         int arr2[] = { 1,2,3,4,0x11223305 }; //小端存储,所以第17个字节是05
         int ret = memcmp(arr1, arr2, 17); //所以对比17个字节都相等
        printf( "%d\n", ret);
         return 0;
}

 

 

但是如果比较的元素是18个的话, 就是不相等的, 这是对arr2的第18的内存单元33 进行和arr1的第18的内存单元00 进行比较, 

结果返回小于0的值, 不同编译器下会不同, 当前返回的是-1

 //如果是字符在内存中进行比较,比较的是它们相对应的ASCII码值,

//所以会出现 'A' < 'a' 这种情况,因为'A' 的ASCII码值是:65   而 'a' 的ASCII码值是:97

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值