繁体   English   中英

带有 function 调用 arg 的 printf() 有时不正确

[英]printf() with a function call arg sometimes incorrect

底部的 C 代码通常按预期运行,在 Ubuntu 20.04 上使用 gcc,但大约 15% 的时间我得到了最高温度的巨大结果:

正常:最高温度:15.30

15% 的时间:最高温度:970363834813736688025683948382903403895871057............00

如果我将 function 从 printf() 调用中拉出来,事情的表现在 100% 的情况下都符合预期:

  double max = maxTemp(temperatures,7);
  printf("Highest temp: %.2lf\n", max);

我假设错误案例是一个巨大的数字,因为某处有一个带有垃圾数据的双精度数。

知道发生了什么吗?

感谢您的时间。

#include <stdio.h>

double maxTemp(double *temps, int numOfTemps);

int main(void) {
    double temperatures[7] = {6.9, 12.3, 9.0, 15.3, 9.8, 1.8, 0.3};    
    printf("Highest temp: %.2lf\n", maxTemp(temperatures, maxTemp(temperatures,7)));
    return 0;
}

double maxTemp(double *temps, int numOfTemps) {
    double max = temps[0];
    for (int i = 0; i < numOfTemps; i++) {
        if (max < temps[i]) {
            max = temps[i];
        }  
    }
    return max;
}                                                                                   

这是你的问题:

maxTemp(temperatures, maxTemp(temperatures,7)))

maxTemp期望它的第二个参数具有int类型并且是temperatures数组中的元素数。 在外部调用中,您传递的是maxTemp结果,它是一个double ,并且是一个温度,而不是数组元素的计数。

编译器应该在那里对你大喊大叫 - 如果没有,打开所有警告并将所有警告视为错误( -Wall -Werror如果你使用的是gcc )。

其次,数组中的最高温度为15.3 - 假设它被转换为int15 ,那么您将遍历数组的末尾变成垃圾。

确定你不是要称之为

maxTemp( temperatures, 7 );

?

正如一条评论指出的那样,您在 main 中调用了两次maxTemp(…)
如果您删除“外部呼叫”,您会没事的,即将 main 更改为:

int main(void) {
    double temperatures[7] = {6.9, 12.3, 9.0, 15.3, 9.8, 1.8, 0.3};
    printf("Highest temp: %.2lf\n", maxTemp(temperatures, 7));
    return 0;
}

原因是maxTemp(temps, n)计算n温度的最大值。 因此,如果n是实际值的数量,它只会正常工作(定义的行为)。 这通常不适用于最高温度。
这意味着您正在考虑temperatures数组之外的值。

为什么有时会起作用(偶然)

数组之外的那些值是未定义的。 分配空间之外的值通常是0 ,但不是根据定义。 这就是为什么它大部分时间都有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM