gpt4 book ai didi

c - 为什么 qsort() 没有返回值?

转载 作者:太空狗 更新时间:2023-10-29 15:23:21 26 4
gpt4 key购买 nike

我大部分时间是一名 C++ 程序员,但为了好玩,我尝试用 C 语言进行一些通用编程。特别是,我实现了一个通用排序算法。我的函数的签名是

int sort(void   *data,
size_t num_elems,
size_t elem_size,
int (*cmp)(const void*, const void*))

当我将其与标准库中的 qsort() 进行比较时,我注意到与我的函数不同,qsort() 没有返回值。由于排序数组总是需要交换元素,因此实现需要大小为 elem_size 的临时存储。由于 C 没有模板,elem_size 在编译时是未知的,因此临时存储必须动态分配,这可能会失败。在这种情况下,qsort() 无法对数组进行排序,但它也无法报告错误,因此无法知道返回时数组是否已排序。

我是不是漏掉了什么?

最佳答案

任何分区算法都需要能够交换两个元素,而 qsort API 意味着代码在编译时不知道它们有多大。但它们不需要作为一个整体进行交换;它们可以一次交换一个字节。 (这实际上就是 memcpy 无论如何都会做的事情。)

下面的注释和宏就在 Gnu libc 实现中 qsort.c 的开头。 (注意代码受LGPL约束)

/* Byte-wise swap two items of size SIZE. */
#define SWAP(a, b, size) \
do \
{ \
size_t __size = (size); \
char *__a = (a), *__b = (b); \
do \
{ \
char __tmp = *__a; \
*__a++ = *__b; \
*__b++ = __tmp; \
} while (--__size > 0); \
} while (0)

关于c - 为什么 qsort() 没有返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44838128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com