qsort, qsort_s
|
Definiert im Header
<stdlib.h>
|
||
| (1) | ||
|
errno_t qsort_s
(
void
*
ptr, rsize_t count, rsize_t size,
int
(
*
comp
)
(
const
void
*
,
const
void
*
,
void
*
)
,
|
(2) | (seit C11) |
-
- count oder size größer als RSIZE_MAX sind
- ptr oder comp ein Nullzeiger sind (es sei denn, count ist null)
-
Wie bei allen bounds-checked-Funktionen ist
qsort_snur garantiert verfügbar, wenn __STDC_LIB_EXT1__ durch die Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ auf die Integer-Konstante 1 setzt, bevor <stdlib.h> eingebunden wird.
Wenn comp zwei Elemente als äquivalent kennzeichnet, ist ihre Reihenfolge im resultierenden sortierten Array nicht spezifiziert.
Inhaltsverzeichnis |
Parameter
| ptr | - | Zeiger auf das zu sortierende Array |
| count | - | Anzahl der Elemente im Array |
| size | - | Größe jedes Elements im Array in Bytes |
| comp | - |
Vergleichsfunktion, die einen negativen Ganzzahlwert zurückgibt, wenn das erste Argument
kleiner
als das zweite ist, einen positiven Ganzzahlwert, wenn das erste Argument
größer
als das zweite ist, und null, wenn die Argumente äquivalent sind.
Die Signatur der Vergleichsfunktion sollte der folgenden entsprechen: int cmp ( const void * a, const void * b ) ; Die Funktion darf die übergebenen Objekte nicht modifizieren und muss konsistente Ergebnisse liefern, wenn sie für dieselben Objekte aufgerufen wird, unabhängig von deren Position im Array. |
| context | - | zusätzliche Informationen (z.B. Sortierreihenfolge), die an comp als drittes Argument übergeben werden |
Rückgabewert
Hinweise
Trotz des Namens verlangen weder die C- noch die POSIX-Standards, dass diese Funktion mittels Quicksort implementiert wird oder irgendwelche Komplexitäts- oder Stabilitätsgarantien bietet.
Im Gegensatz zu anderen grenzprüfenden Funktionen
behandelt
qsort_s
Arrays mit der Größe Null nicht als Laufzeitbedingungsverletzung
und gibt stattdessen erfolgreich zurück, ohne das Array zu verändern
(die andere Funktion, die Arrays der Größe Null akzeptiert, ist
bsearch_s
).
Die Implementierung von
qsort_s
im
Windows CRT
ist nicht mit dem C-Standard kompatibel. Die Microsoft-Version
wird deklariert als:
void
qsort_s
(
void
*
base,
size_t
num,
size_t
width,
int
(
*
compare
)
(
void
*
,
const
void
*
,
const
void
*
)
,
void
*
context
)
;
.
Sie gibt keinen Wert zurück, und die Vergleichsfunktion hat im Vergleich zum Standard eine umgekehrte Parameterreihenfolge: Der
context
wird zuerst übergeben.
Beispiel
#include <limits.h> #include <stdio.h> #include <stdlib.h> int compare_ints(const void* a, const void* b) { int arg1 = *(const int*)a; int arg2 = *(const int*)b; if (arg1 < arg2) return -1; if (arg1 > arg2) return 1; return 0; // return (arg1 > arg2) - (arg1 < arg2); // possible shortcut // return arg1 - arg2; // erroneous shortcut: undefined behavior in case of // integer overflow, such as with INT_MIN here } int main(void) { int ints[] = {-2, 99, 0, -743, 2, INT_MIN, 4}; int size = sizeof ints / sizeof *ints; qsort(ints, size, sizeof(int), compare_ints); for (int i = 0; i < size; i++) printf("%d ", ints[i]); printf("\n"); }
Ausgabe:
-2147483648 -743 -2 0 2 4 99
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
-
- 7.22.5.2 Die qsort-Funktion (p: TBD)
-
- K.3.6.3.2 Die qsort_s-Funktion (p: TBD)
- C17 Standard (ISO/IEC 9899:2018):
-
- 7.22.5.2 Die qsort-Funktion (S. 258-259)
-
- K.3.6.3.2 Die qsort_s-Funktion (S. 442-443)
- C11-Standard (ISO/IEC 9899:2011):
-
- 7.22.5.2 Die qsort-Funktion (S. 355-356)
-
- K.3.6.3.2 Die qsort_s-Funktion (S. 609)
- C99-Standard (ISO/IEC 9899:1999):
-
- 7.20.5.2 Die qsort-Funktion (S: 319)
- C89/C90 Standard (ISO/IEC 9899:1990):
-
- 4.10.5.2 Die qsort-Funktion
Siehe auch
|
(C11)
|
durchsucht ein Array nach einem Element eines nicht näher bezeichneten Typs
(Funktion) |
|
C++-Dokumentation
für
qsort
|
|