为什么这个变量会在代码中改变?

Why does this variable change in the code?

本文关键字:代码 改变 变量 为什么      更新时间:2023-10-16

我用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的值发生变化。

该语言没有对程序的行为指定任何保证。但是从实现的角度来看,很有可能na[n]碰巧在堆栈上共享相同的地址。