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

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

正常:最高温度:15.30

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

如果我将函数从 printf() 调用中拉出来,那么事情在 100% 的情况下都按预期运行:

  double max = maxTemp(temperatures,7);
  printf("Highest temp: %.2lfn", 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: %.2lfn", 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 );

?


以上是带有函数调用arg的printf()有时不正确的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>