2017-01-20 9 views
-1

my関数は2つの存在する配列(+サイズ)と、関数内で新しい配列を構築し、最後にサイズを再割り当てするポインタを取得します。 最後に関数は新しいサイズを返しますが、新しい配列のprintfはクラッシュします。 新しいサイズが本当に真実であるアルゴリズムがうまく動作します。reallocと配列に関する問題

int UniteArray(int *a,int sizeA,int *b,int sizeB,int *tempArray) 
{ 
    int i=0,j=0,counter=0; 
    tempArray=(int*)malloc(sizeA*sizeof(int)); 
    while (i<sizeA) 
     { 
      if (a[i]==b[j]) 
       { 
        tempArray[counter++]=a[i]; 
        i++;j++; 
       } 
      else if (a[i]<b[j]) 
       i++; 
      else if (b[j]<a[i]) 
       j++; 

     } 
    tempArray=(int*)realloc(tempArray,counter); 
    return counter; 
} 

ここでは関数呼び出しを示します。

void Ex3() 
{ 
    int *a,*b,*unite; 
    int sizeA,sizeB,newSize,counter,i; 

    a=BuildArray(&sizeA);//Build the A array. 
    b=BuildArray(&sizeB);   //Build the B array.          
    merge_sort(a,0,sizeA-1);//merge the A array. 
    merge_sort(b,0,sizeB-1);   //merge the B array. 

    counter=UniteArray(a,sizeA,b,sizeB,&unite); //<<<<<<< HERE 
    printf ("The new Length: %d.\n",counter); 
    for (i=0;i<counter;i++) 
     printf ("%d ",unite[i]); 
+1

コンパイラの警告を無視する(または古代のコンパイラを使用する)が、なぜコードが機能しないのかを知ることができます。次回はすべての推奨される警告を有効にし、警告メッセージなしでコードをコンパイルし、デバッガを使用してください。そして、ローカル変数が何であるかを学びます。それはあなたのCの本やレッスンのなかで最初のはずです。後者の場合:ローカル変数と値渡しについて明確にするよう先生に教えてください。 – Olaf

+0

* Ahem *もう少し触ってみると...あなたの質問には、エラーの全文を含める必要があります。私たちは本当に "それが墜落"したり、 "エラーがありました"とあなたを助けることができません。それが「セグメンテーション・フォールト」の場合は、理由を見つけるために別のツールを使用する必要があります。 segfaultsの詳細については、[この質問と回答](http://stackoverflow.com/q/33047452/472647)を参照してください。 – CodeMouse92

答えて

3

あなたはUniteArrayの5番目のパラメータのためのint **を渡しますが、機能はint *を期待しています。どちらもポインタですが、ではなく、と同じです。あなたのコンパイラはこれについてあなたに警告していたはずです。

int **を受け入れるように機能を変更し、それに応じて参照をtempArrayに変更する必要があります。また、十分なメモリを再割り当てしていません。カウンターにsizeof(int)を掛ける必要があります。

int UniteArray(int *a,int sizeA,int *b,int sizeB,int **tempArray) 
{ 
    int i=0,j=0,counter=0; 
    *tempArray=malloc(sizeA*sizeof(int)); 
    while (i<sizeA) 
     { 
      if (a[i]==b[j]) 
       { 
        (*tempArray)[counter++]=a[i]; 
        i++;j++; 
       } 
      else if (a[i]<b[j]) 
       i++; 
      else if (b[j]<a[i]) 
       j++; 

     } 
    *tempArray=realloc(*tempArray,counter*sizeof(int)); 
    return counter; 
} 
+0

FIXEDありがとうございました! –

+0

@NaorMalcaあなたを助けたら答えをupvoteしてください。 – RoadRunner

+1

@NaorMalcaは実際にあなたのために働く答えを受け入れます – artm

関連する問題