2017-09-19 6 views
0

ヒープ内の配列をソートする関数を記述する必要があります。この関数は、配列のコピーを作成し、コピーをソートし、ソートされたコピーへのポインタを返す必要があります。私はqsort()しようとしましたが、私は奇妙な出力を取得します。私はそれがポインタと何かを持っていると確信していますが、まだそれを把握することはできません。ヒープ内の配列のソート

これは、これまでの私のコードです:

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

アンこの私が

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

'int'の配列に' int'へのポインタの配列をダンプすることは、何をしようとしているのか良いスタートではありません。とにかく、あなたは実際には容量にコピーしていません。 'memcpy'の3番目の引数は* bytes *のサイズです。要素数ではありません。最後に、「ソートされたコピーを返す」には、追加のin/outパラメータ、静的配列、またはいくつかの動的割り当てのどちらかが含まれます。 – WhozCraig

+0

[this](https://ideone.com/m9zdtF)のように修正されました – BLUEPIXY

+1

funcion closureの後に削除されるローカル変数のアドレスを返しています – bobra

答えて

0

まあ、sorted_copy()の2番目のパラメータとして渡された配列の要素数でなければなりません取得しています出力最初のパラメータであり、そのsizeof(メモリバイトのオブジェクトのサイズ)ではなく、intが4バイト幅の32ビットアーキテクチャを使用していて、eの配列番号として40を渡しているとします配列内の実際のセル数ではない10ではありません。

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

変更

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

、あなたは正しい結果を得るでしょう。