• 22.0、C语言——内存函数的剖析和使用


    22.0、C语言——内存函数的剖析和使用

    那么在使用内存函数的时候引入头文件 头文件;

    memcpy ( )

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

            1. 函数 memcpy() 从 source 的位置开始向后复制 num 个字节的数据到 destination 的内存位置;
            2. 这个函数在遇到 ' \0 ' 的时候并不会停下来;
            3. 如果 source 和 destination 有任何的重叠,复制的结果都是未定义的;【比如:int arr[] = {1,2,3,4,5,6,7,8,9,10}; memcpy(arr+2,arr+4,16);那么数据重叠了导致无法正常拷贝;】
            4. 内存拷贝函数 memcpy() 可以拷贝任何数据类型,而 strcpy()函数 只能拷贝字符串类型的数据;

            自定义模拟实现 my_memcpy() 函数,代码如下::

    1. char* my_memcpy(void* dest,const void* source,unsigned int num) {
    2. assert(dest && dest);
    3. void* ret = dest;
    4. while (num--) {
    5. *(char*)dest = *(char*)source;
    6. ((char*)dest)++;
    7. ((char*)source)++;
    8. }
    9. return ret;
    10. }

    memmove ( )

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

            1. 在上面的 memcopy( ) 函数说道 -> 如果拷贝的数据内存发生重叠则无法正常拷贝,那其实 memmove ( ) 函数就是来解决这个问题的; 

                   自定义模拟实现 my_memmove() 函数,代码如下:

    1. char* my_memmove(void* dest,const void* source,unsigned int num) {
    2. assert(dest && dest);
    3. void* ret = dest;
    4. int flag = num;
    5. //1.source 在 dest 前面,就从后往前 copy
    6. if(source < dest) {
    7. while(flag--) {
    8. *((char*)dest + num-1) = *((char*)source + num-1);
    9. ((char*)dest)--;
    10. ((char*)source)--;
    11. }
    12. }
    13. //2.source 在 dest 后面,就从前往后 copy
    14. else {
    15. while (flag--) {
    16. *(char*)dest = *(char*)source;
    17. ((char*)dest)++;
    18. ((char*)source)++;
    19. }
    20. }
    21. return ret;
    22. }

    memcmp ( )

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

            1. 比较从 ptr1 和 ptr2 指针开始的 num 个字节【num 是字节数】
            2. 返回值如下:
    Retuen value
    ———————————————————————————————————————————

    returns an integral value indicating the relationship between the content of the memory blocks:

    return valueindicates
    < 0the first byte that does not match in both memory clocks has a lowe value in ptr1 than in ptr2 ( if evaluated as unsigned char values ) 
      0the contents of both memory blocks are equal
    > 0the first byte that does not match in both memory blocks has a greater value in ptr1 in ptr2 ( if evaluated as unsigned char values ) 

            3. 和 strcmp() 函数比较的方式差不多,一 一 对比,直到对比到两个不同的元素,或者对比完 num 个字节;
            比如 -> int ptr1[] = {1,2,3,4,5}; int ptr2[] = {1,2,7,4,5}; memcmp( ptr1 , ptr2 , 12); 那么在 vs 编译器下 返回的值是 -1 ;
     

    memset ( )

    内存设置函数 ->
    void* memset ( void* dest , int c , size_of count );

    实例代码,如下所示:

    1. int main() {
    2. char str[10] = { 0 };
    3. memset(str, '#', 9);
    4. printf("%s",str);
    5. return 0;
    6. }

            初始化一个 10 个字节的字符数组,再用 memset() 函数将该数组的前 9 个字节改成 ' # '

            memset() 函数可以把 任何类型的任何数据 修改成 -> 任何类型的任何数据,但是注意 -> 每次修改的内存空间大小为 1 字节;
     

  • 相关阅读:
    k8s statefulSet 学习笔记
    前端项目代码学习笔记
    让我们谈谈密码哈希
    jenkins实践篇(1)——基于分支的自动发布
    NEON优化3:矩阵转置的指令优化案例
    神经网络的图像识别技术,神经网络识别图像原理
    A * 算法(机器人路径避障规划)
    springboot配置文件加载顺序
    halcon 算子shape_trans
    泡沫填充轮胎
  • 原文地址:https://blog.csdn.net/m0_52433668/article/details/126866756