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


【移动内存】 阅读下列程序说明和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:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值