gpt4 book ai didi

c - 函数返回错误值,在 C 中,使用 gcc Intel 编译器

转载 作者:行者123 更新时间:2023-12-04 15:58:48 25 4
gpt4 key购买 nike

我写这篇文章是因为我真的不知道为什么会这样。我知道如何纠正它/绕过它,但我想知道的是发生这种情况的原因。我正在使用 C,我的编译器是在 Intel 机器上运行的 gcc 4.4.1 (TDM)。

关于 float 的假设: - 符合 IEEE 754 标准 - 以大端方式存储

假设我们有一个函数接受一个 4 字节的数组并将它们作为 float 返回。这就是函数的目标。我们还可以说,例如所有函数将做的是以“正确顺序”获取字节,并且由于系统是小端字节序,它只会交换它们并将它们放入 float 以返回一个值。为简单起见,我不包括对 NaN 或 INF 的任何检查,因为这不是此问题的目的。

float testFunction(char* arr)
{
//this will be the float we return
float ret;

//let's just get a char pointer to the float so we can alter its byte values
char* c = (char*)&ret;
//just swap them so they conform with little endian byte order
c[0] = arr[3];
c[1] = arr[2];
c[2] = arr[1];
c[3] = arr[0];

//up to here if you debug and watch ret's value it is correct as it is supposed to be
return ret;
}

问题是无论我在哪里使用这个函数......让我们像下面这样说

   float f = testFunction(arr);

然后 float f 具有与您作为参数传递的字节完全不相关的 float 值。

成功解决这个问题的方法是声明一个接受 float 作为参数的函数,并在函数内部给它一个值,如下所示:

void testFunction(char* arr,float* f)
{
char* c = ((char*)f)
c[0] = arr[3];
c[1] = arr[2];
c[2] = arr[1];
c[3] = arr[0];
}

但我的问题仍然是,为什么当我尝试返回值时会发生这种情况?我明白 float ret 是函数范围内的一个临时值,但 return 语句应该将它的值复制到函数之外。这不对吗?我错过了什么?我想这一定是非常明显的事情。

最佳答案

实际上,在这两种情况下, float 都应该有一个“完全不相关”的值,除非您精心制作该字符数组(例如 float 中的 memcpy)。

您不能只设置字节并希望它能神奇地匹配您平台上的表示。

关于c - 函数返回错误值,在 C 中,使用 gcc Intel 编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7865054/

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