【发布时间】:2023-02-05 06:07:37
【问题描述】:
我在手册页上没有找到任何关于此的内容,但 cppreference.com 说:
比较函数的签名应该等同于 下列的:
int cmp(const void *a, const void *b);该函数不得修改传递给它的对象,并且必须返回 为相同的对象调用时一致的结果,无论 他们在数组中的位置。
使用
strtod, atof等转换字符串是否会被修改并导致未定义的行为?目标是对
char *数组进行数字排序。如果它是非法的,我是否必须编写自己的排序例程?
【问题讨论】:
-
该函数不得修改
a和b指向的值。它可以使用这些值来生成其他值,但不能更改原始数据。 -
strtod、atof等不修改原字符串,可以正常使用 -
我会说,因为将字符串转换为整数(使用
atoi等)是完全qsort比较函数中的正常操作! -
“使用 strtod、atof 等转换字符串是否会受到修改并导致未定义的行为?”仅当您尝试更改
*a或*b时。从 *a 和 *b 派生其他值不会改变 *a 和 *b 所以没关系 -
请注意,比较函数签名中的指针明确声明为
const。这意味着它真的是“非法”试图修改指向的数据。 (也就是说,如果您错误地尝试修改指向的数据,编译器会报错,除非您也欺骗性地丢弃常量。)因此,在合理的范围内,如果您使用指向的数据是只读的(就像在适当的比较函数中一样)您应该能够依靠编译器缺少const违规来说服自己您的代码是 kosher。