2

qsortで:

void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));

ドキュメントの説明:

size
Size in bytes of each element in the array.
size_t is an unsigned integral type.

ただし、通常、qsort はqsort(...,...,sizeof(int),...)、またはqsort(...,...,sizeof(char *),...)

私の理解が正しければ、文字列のサイズを決定できないため、もはや問題ではなく、代わりに sizeof(char*) を型宣言として使用します。

説明はありますか?

4

1 に答える 1

3

qsort配列として扱うことができる連続したメモリ ブロックが必要です。そのため、配列内の各項目は同じサイズである必要があり、qsort呼び出すときにそのサイズを指定します。

実際の文字列を配列に格納する場合は、すべて同じサイズ (最大のもののサイズ) である必要があります。

そして、比較関数がそれらを比較するとqsort、文字列自体を交換するため、ほぼ確実に大量のメモリを移動してソートを完了します。

はるかに一般的なのは、文字列自体を配列領域のに格納し、配列を使用してそれらの文字列へのポインターを格納することです。ポインター自体は交換されますが、ポインターが指す文字列よりも平均してはるかに小さくなります。

たとえば、次のようにします。

char *strings[] = {"xyzzy", "zorkmid", "twisty little passages", "plugh"};

配列はstringsこれらの文字列への 4 つのポインターで構成され、各ポインターは 4 バイトを占めます (私のシステムでは、あなたのものは異なる場合があります)。が配列をソートするときqsort、その配列内で移動するのはポインタだけです。

于 2013-08-13T07:54:22.550 に答える