2016-03-27 9 views
1

構造体の配列があります。これは昇順でソートしたいものです。Cの構造体の配列を並べ替える

スタックオーバーフローに関するかなりの研究の後、私はsorting members of structure arrayを見つけました。

そこで私は、次のコードを持っている:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct StockItem { 
    int unitPrice; 
    // ... 
} stockItem; 

int comparePrice(const void* a, const void* b) 
{ 
    stockItem *stockItem1 = (stockItem *) a; 
    stockItem *stockItem2 = (stockItem *) b; 
    return stockItem1->unitPrice - stockItem2->unitPrice; 
} 

int main() { 
    stockItem stockItem1; 
    stockItem1.unitPrice = 15; 

    stockItem stockItem2; 
    stockItem2.unitPrice = 41; 

    stockItem stockItem3; 
    stockItem3.unitPrice = 25; 

    stockItem stockItems[3] = {stockItem1, stockItem2, stockItem3}; 
    int size = 3; 

    qsort(stockItems, (size_t) size, sizeof(int), comparePrice); 

    printf("\n"); 
    for (int i = 0; i < size; i++) { 
     printf("%d\n", stockItems[i].unitPrice); 
    } 

    return 0; 
} 

をしかし、これは配列をソートしていないようです。

+1

どのような出力が得られますか? –

+0

'sizeof(int)'と 'sizeof(stockItem)'とは何ですか? – dbush

+0

同じ配列が返されました。変更はありません –

答えて

4

これは奇妙です。私が見ることができるのは、intではなくsizeof(stockItem)を使用しなければならないということだけですが、システムに奇妙なアライメントがない限り問題はありません。また、サイズに関するsize_tへのキャストは必須ではありませんが、間違いなく重要です。

編集:オンラインで作業するコードへのリンクを追加しようとしましたが、リンクが間違っています。基本的には、パッキングを使用しない限り、構造体のアライメントは保証されません。

+0

これはコメントでなければなりません。 –

+0

それは実際に答えです!答えとしてより適しているようにあなたの投稿を書き換えてみてください。私は 'sizeof(intItem)'を使用していたはずの 'sizeof(int)'を使用しました。 –

+2

はい、私はモバイルで脂肪指を持っているので、あまりにも早く投稿する必要があります –