内存移动:memmove原理模拟实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qigaoqiang/article/details/78166208

【移动内存】 阅读下列程序说明和C代码,在下划线“__”处填入语句。

【程序说明】子程序Move是将地址为A开始的N个存储单元 移动到地址为B开始的N个存储单元中,对于两个区域重叠的情况也能正确处理。

【温馨提示】分为三种情况考虑,一种相等不处理,一种是顺序操作肯定不会重叠,最后一种…;后面两种需要调用Save函数,该函数已经编写完成。


#define MAX  100  /* 总共在100个数据中处理 */       
#define N    10   /* 两个存储单元长度为10个单位 */  

int *A, *B;                                         

void Save(int *a, int *b, int Step)                 
{                                                   
    for (int i = 0; i < N; i++)                       
    {                                                 
        *b = *a;                                        
        a += Step;                                      
        b += Step;                                      
    }                                                 
}                                                   

void Move()                                         
{                                                   
    int *a, *b, Step;                                 

    a = A;                                            
    b = B;                                            

    if (a == b)
    {
        return; 
    }
    else if (_____) 
    {                    
        __________;       
        __________;        
        __________;        
    }                    
    else                 
    {                    
        __________;        
    }                    
    Save(a, b, Step);
}

int main(void)
{
    int i, Array[MAX];

    random(); /* 初始化随机数因子,random(int X)返回不小于0,
                    不大于X的随机整数 */
    A = &Array[random(MAX - N)];
    B = &Array[random(MAX - N)];

    for (i = 0; i < N; i++)
        A[i] = i;
    Move();

    return 0;
}

【图解分析】

//TODO:
1、Save函数功能分析

2、三种情况分析

【分析结果】

if (a == b)
{
    return;
}                  
else if ((a - b < 0) && (a - b > -N)) 
{                                     
    a += N-1;                           
    b += N-1;                           
    Step = -1;                          
}                                     
else                                  
{                                     
    Step = 1;                           
}                                     

【总结】

    //TODO:

猜你喜欢

转载自blog.csdn.net/qigaoqiang/article/details/78166208