为什么这个变量会在代码中改变?
Why does this variable change in the code?
我用c++写了一个归并排序函数。其中传递函数上限错误值(数组超出边界)
int a[]={6,5,2,4,6,78,88,76,33,44,54,212,344,56,677};
int n=sizeof(a)/sizeof(a[0]);
printf("n=%dn",n);
merges(a,0,n); // if should be 'merges(a,0,n-1)'
printf("n=%dn",n);
我认为在参数中只传递变量的副本。原值不变。但是检查前后合并()函数我得到两个不同的值。我不知道为什么?输出:
n=15
n=677
完整代码:
#include<bits/stdc++.h>
using namespace std;
void mergeit(int a[],int l,int mid,int r)
{
int n1=mid-l+1;
int n2=r-mid;
int ll[n1+1];ll[n1]=INT_MAX;
for(int h=0;h<n1;h++)ll[h]=a[l+h];
int rr[n2+1];rr[n2]=INT_MAX;
for(int h=0;h<n2;h++)rr[h]=a[mid+1+h];
int i=0,j=0;
for(int k=l;k<=r;k++)
{
if(ll[i]<rr[j])
{
a[k]=ll[i];i++;
}
else{a[k]=rr[j];j++;}
}
}
void merges(int a[],int l,int r)
{
if(l<r)
{
int mid=(l+r)/2;
merges(a,l,mid);
merges(a,mid+1,r);
mergeit(a,l,mid,r);
}
}
int main()
{
int a[]={6,5,2,4,6,78,88,76,33,44,54,212,344,56,677};
int n=sizeof(a)/sizeof(a[0]);
printf("n=%dn",n);
merges(a,0,n); //array out of bound- it should be 'merges(a,0,n-1)'
printf("n=%dn",n);
}
这是因为当你写内存越界时,程序的行为是未定义的。可以观察到的一种可能的行为是n
的值发生变化。
该语言没有对程序的行为指定任何保证。但是从实现的角度来看,很有可能n
和a[n]
碰巧在堆栈上共享相同的地址。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- visual C++未执行的代码会改变函数行为
- 是否有可能改变.so文件代码在android工作室本身,并使构建
- 什么会导致一行代码在一个地方改变另一个不相关函数的行为
- 代码值应该每次都改变,所以相同的座位不显示,但它没有
- 为什么这样的理论上的跨平台代码不改变Windows上的Enviromental变量
- 为什么这个变量会在代码中改变?
- 为什么当我改变函数返回类型时,c++代码的输出会改变
- 我改变了我的列表(和代码),所以它现在处理Node*而不是Node Objects,这导致了一个未定义的引用错误