2016-06-29 5 views
-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); 


} 

答えて

0

あなたが範囲外のメモリに書き込む際に、プログラムの動作は未定義であるため、それが起こります。観察される可能性のある1つの挙動は、値がnであることです。

この言語は、プログラムの動作に関するいかなる保証も規定していません。しかし実装の観点からは、na[n]がスタック上で同じアドレスを共有する可能性があります。

関連する問題