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

来源:互联网 发布:安卓软件限速 编辑:程序博客网 时间:2024/06/06 02:44

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

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

数据向前移动图示:
这里写图片描述

数据向后移动图示:
这里写图片描述

测试程序:

#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <string.h>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; i<len; i++)    {        *(arr+i) = i+1; // 1 - 15    }    for(i=0; i<len; i++)    {        printf("%d\t", *(arr+i));    }    printf("\n");    /* 所有项后移三个单位长度 */    /* my_memcpy(arr+3, arr, len-3); */    /* 所有项前移三个单位长度 */    my_memcpy(arr, arr+3, len-3);    for(i=0; i<len; i++)    {        printf("%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<len; i++){        *(dst+i) = *(src+i);    }}

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

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

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

0 0
原创粉丝点击