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()什么类型的数据都可以进行复制

 

#include
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 , 单位是字节
}

 C语言的内存操作函数_第1张图片


 

 2.

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

C语言的内存操作函数_第2张图片 

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

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


 3.

memset();  //修改内存中的单元   , 单位是字节
void* memset( void* dest, int c, size_t count );  //目标起始地址,  修改内存单元的起始地址 , 修改的内存单元数量(单位是字节)
#include
int main()
{
         int arr[] = { 0x11111111,0x22222222,3,4,5 };
        memset(arr, 0, 20);
         return 0;
}
内存单元从:
C语言的内存操作函数_第3张图片

 变为:

C语言的内存操作函数_第4张图片

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


4.

memcmp(); //内存单元比较, 单位是字节
int memcmp ( const void * ptr1, const void * ptr2, size_t num );   //目标起始地址,  比较的内存单元的起始地址 , 比较的数量
  • 比较从ptr1和ptr2指针开始的num个字节
  • 返回值和strcmp一样:
    • >返回>0的值   
    • ==返回0 
    • <返回<0的值
#include
#include
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;
}

 C语言的内存操作函数_第5张图片

 

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

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

C语言的内存操作函数_第6张图片

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

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

你可能感兴趣的:(C语言,c语言,后端)