2

やあみんな (この質問は私を不機嫌にさせるので、私はおそらくそうであることに注意してください)、

配列を動的に作成でき、静的に作成された配列に対してqsortを効果的に使用できますが、動的に作成された配列でqsortを使用するのに問題があります。ポインターの使用につまずいていると思います。

struct my_struct {
    FILE *fp;
    int i;
};

したがって、配列には上記の構造体が含まれており、int 値で並べ替えたいと思います。

静的には、次のようなことができます。

struct my_struct array[4];

そして並べ替え:

qsort((void *) &array, sizeof(array) / sizeof(struct my_struct), sizeof(struct my_struct), *compare);

--

このように配列を作成すると:

struct my_struct* = malloc(sizeof(struct process) * 4);

すべてがコンパイルされて実行されますが、実行が比較関数に入ることはありません。

どんな助けでも大歓迎です

4

2 に答える 2

5

sizeof(array) は、定数サイズの配列の場合は (sizeof(struct my_struct) * array_size) ですが、動的配列の場合はポインター サイズのみです。実際のサイズ (malloc に渡したもの) を自分で計算し、それを qsort 呼び出しに入れる必要があります。

于 2012-09-28T04:56:14.803 に答える
2

の呼び出しは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()が書いたものを推測する必要がないように、それが機能しないことを示す必要があります。

于 2012-09-28T05:04:40.300 に答える