C语言|C语言的内存操作函数

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()什么类型的数据都可以进行复制
#includeint 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 , 单位是字节 } 【C语言|C语言的内存操作函数】 C语言|C语言的内存操作函数
文章图片


2.
memmove(); //内存单元复制 (可以自己给自己追加) void * memmove ( void * dest, const void * src, size_t num ); //目标起始地址,要复制内存单元起始地址 , 复制的数量(单位是字节)
  • 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
#includeint 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; } C语言|C语言的内存操作函数
文章图片

//arr1 给 arr1自己进行了复制,并且重叠
//如果是上面 模拟实现memcpy 的方法,数据会被替换, 无法实现重叠,结果会是: 12121218910 //err
3.
memset(); //修改内存中的单元, 单位是字节 void* memset( void* dest, int c, size_t count ); //目标起始地址,修改内存单元的起始地址 , 修改的内存单元数量(单位是字节) #includeint main() { int arr[] = { 0x11111111,0x22222222,3,4,5 }; memset(arr, 0, 20); return 0; } 内存单元从: C语言|C语言的内存操作函数
文章图片
变为:
C语言|C语言的内存操作函数
文章图片

//没有变红的部分,也变0了,只不过本来是0,所以编译器没有变红提示
4.
memcmp(); //内存单元比较, 单位是字节 int memcmp ( const void * ptr1, const void * ptr2, size_t num ); //目标起始地址,比较的内存单元的起始地址 , 比较的数量
  • 比较从ptr1和ptr2指针开始的num个字节
  • 返回值和strcmp一样:
    • >返回>0的值
    • ==返回0
    • <返回<0的值
#include#includeint 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; } C语言|C语言的内存操作函数
文章图片


但是如果比较的元素是18个的话, 就是不相等的, 这是对arr2的第18的内存单元33 进行和arr1的第18的内存单元00 进行比较,
结果返回小于0的值, 不同编译器下会不同, 当前返回的是-1
C语言|C语言的内存操作函数
文章图片

//如果是字符在内存中进行比较,比较的是它们相对应的ASCII码值,
//所以会出现 'A' < 'a' 这种情况,因为'A' 的ASCII码值是:65而 'a' 的ASCII码值是:97

    推荐阅读