c语言学习之内存重叠
来源:互联网 发布:淘宝女式长袖衬衣 编辑:程序博客网 时间:2024/06/05 23:55
遇到这样一个问题,当数组进行拷贝的时候,如果是在同一个数组内拷贝,就有可能出现内存重叠的问题,比如
#include<stdio.h>void Copy(int *a, int *b,int len)//b从开始复制len个数字到a{ int i ; //为了更突出问题,这里不进行参数检查 for (i = 0; i < len; i++) { a[i] = b[i]; }}int main(){ int i; int arr[10] = {1,2,3,4,5,6,7,8,9,10}; Copy(&arr[0], &arr[3], 7); //4,5,6,7,8,9,10,8,9,10 for (i = 0; i < 10; i++) { printf("%d ", arr[i]); } return 0;}结果也正确
但是当我们这样写
#include<stdio.h>void Copy(int *a, int *b,int len)//b从开始复制len个数字到a{int i ; //为了更突出问题,这里不进行参数检查for (i = 0; i < len; i++){a[i] = b[i];}}int main(){int i;int arr[10] = {1,2,3,4,5,6,7,8,9,10};Copy(&arr[3], &arr[0], 7); //1,2,3,1,2,3,4,5,6,7for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;}
原意是想输出1,2,3,1,2,3,4,5,6,7,但是当我们运行的时候却发现是这样
这就是内存重叠的问题了,因为在我们复制的时候,我们自身的值被覆盖所以就导致重复出现123的问题了。
在这样的情况下,我们应该反向复制元素,就是从最后一个元素往前复制
void Copy(int *a, int *b,int len)//b从开始复制len个数字到a{int i ; //为了更突出问题,这里不进行参数检查for (i = len-1; i >= 0; i--){a[i] = b[i];}}
所以我们复制的时候需要分两种情况,一种是原数组在目标数组后,一种是原数组在目标数组前面,而且我们还要考虑是否有内存重叠的部分,所以我们应该这么做
void Copy(int *a, int *b,int len)//b从开始复制len个数字到a{int i ; if ((abs(b - a) < len) && b < a) //判断有重叠部分并且目标数组在后面实行反向复制{for (i = len - 1; i >= 0; i--){a[i] = b[i];}}else //正常复制{for (i = 0; i < len; i++){a[i] = b[i];}}}
以上就是我对内存重叠的理解。
阅读全文
0 0
- c语言学习之内存重叠
- C++学习之内存重叠
- c语言学习笔记之内存分区
- c语言学习笔记24之内存
- C语言之内存使用
- C语言之内存操作
- C语言之内存管理
- C语言之内存对齐
- C语言之内存管理
- C语言之内存操作
- C语言之内存管理
- C语言之内存管理
- C语言之内存对齐
- c语言之内存扫描
- c语言之内存使用
- C语言之内存对齐
- C语言之内存对齐
- c语言之内存管理
- Redhat 7将网卡名称eno16777736改为eth0
- 献给30岁之前为前途迷茫彷徨的男人们的忠告
- 非常好的理解遗传算法的例子
- SQL 分为三种类型
- 大端和小端
- c语言学习之内存重叠
- 图论--tarjan求割点
- 送给前端的你,推荐几篇前端汇总文章。(来自知乎专栏)
- 数据库补漏
- Mac下Scrapy的安装与问题解决
- 在数组中限制次数的取最大值和最小值问题
- 1、Flask初探-快速入门
- HTTP的三种传输协议
- Find them, Catch them POJ