2017-09-19 6 views
0

Ich muss eine Funktion schreiben, um ein Array im Heap zu sortieren. Diese Funktion sollte eine Kopie des Arrays erstellen, die Kopie sortieren und einen Zeiger auf die sortierte Kopie zurückgeben. Ich habe versucht qsort(), aber ich bekomme seltsame Ausgabe. Ich bin sicher, dass es etwas mit dem Zeiger zu tun hat, aber es immer noch nicht herausfinden kann.Sortier-Array in Haufen

Dies ist mein Code so weit:

int cmpfunc(const void * a, const void * b) 
{ 
    return (*(int*)a - *(int*)b); 
} 

int sorted_copy(int* list[], size_t s) 
{ 
    int aList[s]; 
    memcpy(aList,list,s); 
    printf("Array was copied successfuly to aList[] array\n\n"); 
    printf("Before sorting the list is: \n"); 

    for(int i = 0; i < s; i++) 
     printf("%d\n", aList[i]); 

    qsort(aList, s, sizeof(int), cmpfunc); 
    printf("After sorting the list is: \n"); 
    for(int i = 0; i < s; i++) 
    { 
     printf("%d\n", aList[i]); 
    } 
    return *aList; 
} 

int main() 
{ 
    int list[10] = {4, 1, 2, 7, 3, 5, 6, 0, 8, 9}; 
    sorted_copy(list,sizeof(list)); 
    return 0; 
} 

An dieser die Ausgabe ich

Array was copied successfuly to aList[] array 

Before sorting the list is: 
4 
1 
2 
7 
3 
5 
6 
0 
8 
9 
0 
0 
0 
0 
3 
0 
0 
0 
268501009 
32762 
4199840 
0 
-1407817721 
32762 
12846904 
0 
1324151619 
0 
8 
0 
176 
0 
6487584 
0 
4199972 
0 
4200528 
0 
-1434081178 
32762 
After sorting the list is: 
-1434081178 
-1407817721 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
1 
2 
3 
3 
4 
5 
6 
7 
8 
8 
9 
176 
32762 
32762 
32762 
4199840 
4199972 
4200528 
6487584 
12846904 
268501009 
1324151619 

Process returned 0 (0x0) execution time : 0.281 s 
Press any key to continue. 
+1

Ein Array von pointer-to-int in ein Array von int zu entleeren ist kein guter Anfang für alles, was Sie tun möchten. Außerdem kopieren Sie die Kapazität nicht wirklich. Das dritte Argument für 'memcpy' ist eine Größe in * Bytes *; keine Elementanzahl. Und schließlich wird das "Zurückgeben einer sortierten Kopie" entweder einen zusätzlichen Eingangs-/Ausgangsparameter, ein statisches Array oder eine dynamische Zuweisung umfassen. – WhozCraig

+0

fix like [this] (https://ideone.com/m9zdtF) – BLUEPIXY

+1

Sie geben eine Adresse einer lokalen Variablen zurück, die nach dem Schließen der Funktion gelöscht wird – bobra

Antwort

0

Nun bekommen, ging der zweite Parameter von sorted_copy() muss die Anzahl der Elemente des Arrays werden als erster Parameter, und nicht sein sizeof (die Größe des Objekts in Speicherbytes) Ich nehme an, dass Sie eine 32-Bit-Architektur verwenden, wo ein int ist vier Bytes breit, und Sie übergeben 40 als die Array-Nummer von e lements, nicht 10 das ist die tatsächliche Anzahl der Zellen im Array.

ändern

int main() 
{ 
    /* you don't need to specify the number of elements to declare 
    * the array if you are using an initializer that fully populates 
    * the array elements */ 
    int list[10] = {4, 1, 2, 7, 3, 5, 6, 0, 8, 9}; 
    sorted_copy(list,sizeof(list)); /* sizeof gives you the array 
            * size in bytes, not in number 
            * of elements */ 
    return 0; 
} 

in

int main() 
{ 
    int list[] = {4, 1, 2, 7, 3, 5, 6, 0, 8, 9}; 
    sorted_copy(list, sizeof list/sizeof list[0]); 
    return 0; 
} 

und Sie werden das richtige Ergebnis zu bekommen.