2017-01-20 12 views
-1

meine Funktion erhalten zwei vorhanden Array (+ Größen) und Zeiger, die in Funktion neues Array erstellen und die Größe am Ende neu zuweisen. schließlich gibt die Funktion die neue Größe zurück, aber der printf des neuen Arrays stürzt ab. der Algorithmus arbeitet casue die neue Größe wirklich wahr.Probleme mit Realloc und Array

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; 
} 

hier der Funktionsaufruf;

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

So ignorieren Sie Compiler-Warnungen (oder verwenden Sie einen alten Compiler), aber wuomer, warum Ihr Code nicht funktioniert. Beim nächsten Mal aktivieren Sie alle empfohlenen Warnungen, lassen Sie den Code ohne Warnmeldung kompilieren und verwenden Sie den Debugger. Und lerne, was lokale Variablen sind. Das sollte der erste in Ihrem C-Buch oder Ihrer Lektion gewesen sein. Wenn Letzteres: Sagen Sie Ihrem Lehrer, dass er sich über lokale Variablen und den Vorbeifahr-Wert informieren soll. – Olaf

+0

* Ähem * Um das etwas taktvoller zu machen ... OP, müssen Sie den vollständigen Text des Fehlers in Ihre Frage einfügen. Wir können Ihnen wirklich nicht helfen, wenn "es abgestürzt ist" oder "es gab einen Fehler". Wenn es sich um einen "Segmentierungsfehler" handelt, müssen Sie möglicherweise ein anderes Tool verwenden, um den Grund zu finden. Weitere Informationen zu segfaults finden Sie unter [diese Frage und Antwort] (http://stackoverflow.com/q/33047452/472647). – CodeMouse92

Antwort

3

Sie übergeben einen int ** für den fünften Parameter von UniteArray, aber die Funktion eines int * erwartet. Während sie beide Zeiger sind, sind sie nicht gleich. Dein Compiler hätte dich davor warnen sollen.

Sie müssen Ihre Funktion ändern, um eine int ** zu akzeptieren und die Verweise auf tempArray entsprechend ändern. Außerdem wird nicht genügend Speicher neu zugewiesen. Sie müssen den Zähler mit sizeof(int) multiplizieren.

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 vielen Dank! –

+0

@NaorMalca upvote die Antwort, wenn es Ihnen geholfen hat. – RoadRunner

+1

@NaorMalca tatsächlich akzeptieren die Antwort, die für Sie funktioniert – artm