内存重叠
来源:互联网 发布:豆人网络战争前线 编辑:程序博客网 时间:2024/06/05 02:19
内存重叠问题
首先,有这样一道题:
有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。
代码:
void Move(char *arr,int m)
//n个整数,前面各数顺序后移m个位置,最后m个数变成前m个数
{
char brr[100]="";
int len=strlen(arr);
int i;
for(i=0;i<len-m;i++)
{
brr[i]=arr[i+m];
}
for(;i<len;)
{
for(int j=0;j<m;j++,i++)
{
brr[i]=arr[j];
}
}
printf("%s\n",brr);
}
int main()
{
char *arr="123456789";
Move(arr,4);
return 0;
}
示意图:
这个还是比较好实现的,但是当问题变成这样:
移动后m个到前面去,如图
代码:
void Move2(int *des,int *src,int len)
{
for(int i=0;i<len;i++)
{
des[i] =src[i];
}
}
void Show(int *arr,int len)
{
for(int i=0;i<len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
Move2(&arr[0],&arr[3],7);
Show(arr,sizeof(arr)/sizeof(arr[0]));
return 0;
}
这个也还好,省去了把前n-m个格子放到后面
但当问题变为
移动前m个到后面去,如图:
这个时候就要注意了,当你赋值的时候,arr[0]赋值给arr[3],arr[1]赋值给arr[4],arr[2]赋值给arr[5],但当arr[3]给arr[6]赋值是便会出错,因为你第一步赋值的时候更改了arr[3]的值,这就是内存重叠。
对于内存重叠,我所想的办法是新创建一个数组,把要移动的部分赋值到相应的位置,然后再把剩余的赋值,再复制回原数组,
代码:
void Move3(int *arr,int n,int m) //n数组长度,m往后移几个
{
int i;
int j;
int *p = (int *)malloc(m*sizeof(int));
for(i=m,j=0;j<n,i<n;i++,j++)
{
p[i]=arr[j];
}
for(i=0,j=0;j<m,i<m;i++,j++)
{
p[i]=arr[j];
}
for(i=0;i<n;i++) //把移好的复制过来
{
arr[i] = p[i];
}
}
但这个是借助了另一个数组,只用一个数组就需要判断地址了,对于这个方法,我没有写出来,等写出来再做修改。
- 内存重叠
- 内存重叠
- 内存重叠
- 内存重叠
- 内存重叠
- memcpy 内存重叠问题
- memcpy内存重叠问题
- C++中“内存重叠”
- 约瑟夫环、内存重叠
- 粗浅讨论内存重叠
- 浅聊内存重叠
- C语言:内存重叠
- memcpy内存重叠的解决
- 有关内存重叠的问题
- memmove函数与内存重叠
- 内存重叠之strcpy&memmove
- C语言:内存重叠问题
- 手动实现memcpy涉及内存重叠与不重叠情况
- jmeter监控服务器性能配置
- JAVA----操作XML文件的两个封装方法
- 数学建模(4)——模拟退火
- 安全测试
- 《leetcode》spiral-matrix-ii(构造螺旋矩阵)
- 内存重叠
- squid 启用https反向代理代理
- 第五课 Tensorflow TFRecord读取数据
- 欢迎使用CSDN-markdown编辑器
- 谱聚类(spectral clustering)原理总结
- [LintCode 376] 二叉树的路径和(Python)
- Linux系统里安装源码包
- js call 方法简单介绍
- java 鼠标悬停等一系列操作