c++系列-memcpy与memmove

memcpy不能解决内存重叠,而memmove可以,具体实现方法为若内存区域有重叠  采用从后往前复制。即:

`memmove` 解决内存重叠问题的核心在于**拷贝的顺序**。它通过判断源内存区域和目标内存区域的相对位置,选择正确的拷贝方向,从而避免数据被覆盖。

 

### 具体操作流程:

1. **内存不重叠的情况**:

   - 如果源和目标内存区域没有重叠,`memmove` 的行为与 `memcpy` 相同,可以直接从前向后进行拷贝,按字节顺序将源区域的数据复制到目标区域。

 

2. **内存重叠的情况**:

   - **源内存区域在目标内存区域之前**:如果源区域的起始地址比目标区域的起始地址要低,即 `src < dest`,且重叠,`memmove` 会从**前向后**拷贝。这时直接拷贝不会引发问题,因为目标区域还没有被覆盖。

   - **源内存区域在目标内存区域之后**:如果源区域的起始地址比目标区域的起始地址要高,即 `src > dest`,且重叠,`memmove` 会从**后向前**拷贝。这是为了防止目标区域的前半部分先被覆盖,然后再拷贝源数据,从而确保数据的完整性。

 

### 具体步骤:

- **前向拷贝**(`src` 在 `dest` 之前):按从低地址到高地址的顺序逐字节或逐块(根据具体实现)进行拷贝。

- **后向拷贝**(`src` 在 `dest` 之后):按从高地址到低地址的顺序逐字节或逐块进行拷贝,确保目标内存未被覆盖时就拷贝源内存。

 

### 举例说明:

 

假设有两个内存区域 `src` 和 `dest`,并且它们重叠:

 

- **重叠情况 1**: `src` 在 `dest` 之前,例如:

  ```c

  src: [A][B][C][D][E] (source memory)

  dest: [B][C][D][E][ ]

  ```

  如果直接从前往后拷贝,`B`、`C` 等可能会覆盖掉源区域的数据,从而导致拷贝错误。因此 `memmove` 会从后向前拷贝,避免覆盖。

 

- **重叠情况 2**: `src` 在 `dest` 之后,例如:

  ```c

  src: [B][C][D][E][ ]

  dest: [A][B][C][D][E] (destination memory)

  ```

  在这种情况下,直接从前向后拷贝是安全的,因为源区域在目标区域的后面,拷贝时不会覆盖未被拷贝的数据。

 

### 小结:

`memmove` 通过判断内存块的相对位置,选择从前向后或从后向前拷贝,来防止在内存重叠时发生数据覆盖。这是它能够安全处理重叠问题的根本原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值