-2
私はmergesort関数を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=%d\n",n);
merges(a,0,n); // if should be 'merges(a,0,n-1)'
printf("n=%d\n",n);
私は、引数に変数のコピーだけが渡されると思います。元の値は変更されません。しかし、マージ()関数の前と後のチェック私は2つの異なる値を得ました。なぜ私は理解できませんか? 出力:
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=%d\n",n);
merges(a,0,n); //array out of bound- it should be 'merges(a,0,n-1)'
printf("n=%d\n",n);
}