の呼び出しはqsort
偶然にのみ機能します。
qsort((void *) &array, sizeof(array) / sizeof(struct my_struct), sizeof(struct my_struct), *compare);
配列のアドレスの値は同じですが、配列の 0 番目の要素のアドレスとは型が異なります。to のキャストvoid *
も不要です。また、コンパレータ関数の逆参照も従来どおりです。通常、それは次のように記述されます。
qsort(array, sizeof(array) / sizeof(array[0]), sizeof(struct my_struct), compare);
または:
qsort(array, sizeof(array) / sizeof(array[0]), sizeof(array[0]), compare);
動的に割り当てられた構造がある場合:
size_t num_items = 4;
struct my_struct *dynarr = malloc(sizeof(struct my_struct) * num_items);
また:
struct my_struct *dynarr = malloc(sizeof(*dynarr) * num_items);
の呼び出しで要素数を別の方法で指定しますqsort
が、残りは基本的に変更されません。
qsort(dynarr, num_items, sizeof(*dynarr), compare);
特に、単純なポインター変数である の&
前にないことに注意してください。dynarr
あなたのコードが間違っていた理由
推測ですが、もっともらしい推測です。 あなたが書いた場合:
qsort(&dynarr, sizeof(dynarr) / sizeof(dynarr[0]), sizeof(dynarr[0]), compare);
thensizeof(dynarr)
はポインターのサイズ (たとえば、64 ビット プログラムでは 8 バイト) であり、sizeof(dynarr[0])
16 バイトであるため、並べ替えるように指示するサイズ (要素の数)qsort()
は 0 (理由8 / 16 == 0
) であるため、コンパレーターは呼び出されません。 . プログラムが 32 ビット プログラムとしてコンパイルされている場合、サイズはポインターが 4 バイト、構造体が 8 バイトであるため、結果は 0 のままです。
4
代わりにorを配列のサイズとして渡すnum_items
と、クラッシュすることに注意してください。のアドレスはdynarr
、関数に渡すには間違ったアドレスです。それ自体が格納さdynarr
れているアドレスではなく、 に保持されているアドレス値を渡したい場合。dynarr
注意: あなたqsort()
が書いたものを推測する必要がないように、それが機能しないことを示す必要があります。