2016-07-09 19 views
0

オンライン裁判官に次の機能を実装している間、二重のフリーまたは破損(!prev)エラーが発生します。Cのdouble freeまたはcorruption(!prev)エラー

void nextPermutation(int* A, int n1) 
{ 
    int i = 0; 
    int tmp = 0; 
    int flag = 0; 
    int ret = 0; 

    if(n1 == 1) 
     return A[0]; 

    for(i = n1; i > 0; i--) 
    { 
     if(flag == 0) 
     { 
      if(A[i] > A[i - 1]) 
      { 
       tmp  = A[i]; 
       A[i]  = A[i - 1]; 
       A[i - 1] = tmp; 
       flag  = 1; 
       ret  = i; 
       break; 
      } 
     } 
    } 

    for(i = ret; i < n1 - 1; i++) 
    { 
     if(A[i] > A[i + 1]) 
      tmp = A[i]; 

     A[i]  = A[i + 1]; 
     A[i + 1] = tmp; 
    } 
} 

ただし、カスタム入力を使用してコードをテストするとうまくいきます。 誰も私になぜこれが起こるのか教えてもらえますか?

+1

あなたの関数は戻り値の型としてvoidを持ち、最初のif条件でA [0]を返しています。 – denis

+3

2番目の 'for'ループでは、3つの割り当てがすべて' if'の一部であるはずですか?中括弧は使用していないので、最初の行だけが 'if'にあります。 – Barmar

+0

発信元のコードを投稿できますか? – denis

答えて

4

このコードのint * Aのサイズは?最初のforループでは、(n1-1)でiを初期化する必要があると思います。

for(i=(n1-1);i>0;i--) 

ループ内でA [i-1]が評価されているので、i> 0の条件は問題ないと思われます。

私はmallocを使ってint *にメモリを割り当てる必要があると思います。また、私が上記のコメントで述べたように、A [0]を返すことはできません。

関連する問題