【发布时间】:2021-12-28 17:51:13
【问题描述】:
我对@987654322@ 函数的结果感到困惑,在下面的情况下为-1。
#include <stdio.h>
int test(const void*, const void*);
int main()
{
int a = 10, b = 5;
int result = test(&a, &b);
printf("Result: %d", result);
return 0;
}
int test(const void* a, const void* b) {
const double* da = (const double*)a;
const double* db = (const double*)b;
return (*da > * db) - (*da < *db);
}
0x0135fb00 现在是我的 da 值和地址 0x0135faf4 现在是我的 db 值和 b 地址
据我所知,关系运算符在 True 时返回 1,在 False 时返回 0,所以在这种情况下我们应该有:
*da > *db --> 1
因为da(a 的地址)的值大于db(b 的地址)的值。*da < *db --> 0
因为da(a 的地址)的值不小于db(b 的地址)的值。
所以1-0就是1。
只是为了说明,我通过调试器比较 da 的值和 db 的值得出了这个结论(我使用的是带有默认 C 编译器的 Visual Studio)。我错过了什么?
PS:我在官方GNU web site上遇到过这段代码。
【问题讨论】:
-
什么是
sizeof(int)和sizeof(double)?我怀疑你没有阅读你认为你正在阅读的内容...... -
您为什么决定将指向
int的指针重新解释为指向double的指针?那部分绝对不是来自您问题中的链接 -
@bersi 仅仅因为编译的代码并不意味着它是正确的。在您的情况下,您将指针转换为不兼容的类型(从
int*到double*),从而调用未定义行为。在 C 中,确保代码不违反此类规则始终是程序员的责任 -
从
int转换为double调用显式转换。从int*转换为double*并取消引用会导致未定义的行为。当您将int的地址转换为double的地址时,您不会更改该地址的数据。 -
@bersi 简单。您的
int有 4 个字节(不是位)。当您将其转换为double时,它会占用内存中的 4 个相邻字节,这些字节通常包含垃圾或其他变量(或者,甚至是返回地址,因此这是一个安全问题)