使用memcpy移动数据位置的思考

使用memcpy将一段数据整体向前移动没有问题,但是整体向后移动会造成数据拷贝错误

【在centos系统中这种方法没有发现问题,但是在后续的开发中,在将代码移植到ubuntu系统时,发现向前移动也会有问题,不同linux版本该函数的实现方法不同;所以建议不要使用这种方法移动内存区,可以使用临时变量或其它方法实现数据移动】

数据向前移动图示:
使用memcpy移动数据位置的思考_第1张图片

数据向后移动图示:
使用memcpy移动数据位置的思考_第2张图片

测试程序:

#include 
#include 
#include 
#include 

void my_memcpy(int *dst, const int *src, size_t len); /* 模拟memcpy函数 */

int main()
{
    int len = 15;

    int *arr = (int *)calloc(len, sizeof(int));


    /* 赋值 */
    int i=0;
    for(i=0; i1; // 1 - 15
    }

    for(i=0; iprintf("%d\t", *(arr+i));
    }
    printf("\n");

    /* 所有项后移三个单位长度 */
    /* my_memcpy(arr+3, arr, len-3); */


    /* 所有项前移三个单位长度 */
    my_memcpy(arr, arr+3, len-3);

    for(i=0; iprintf("%d\t", *(arr+i));
    }
    printf("\n");

    return 0;
}

void my_memcpy(int *dst, const int *src, size_t len)
{
    int i=0; 
    for(i=0; i

向前移动结果:
这里写图片描述

向后移动结果:
这里写图片描述

总结:
由于memcpy函数是从指针的起始位置开始依次向后移动,而后面的数据会在遍历的同时被修改,当指针移动到被修改的数据时该数据早已不是原始的数据了

你可能感兴趣的:(服务器编程,c)