【问题标题】:printf() with a function call arg sometimes incorrect带有函数调用 arg 的 printf() 有时不正确
【发布时间】:2021-03-18 05:17:22
【问题描述】:

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

正常: 最高温度:15.30

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

如果我将函数从 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;
}                                                                                   

【问题讨论】:

  • 我建议您添加更多printf() 语句来调试您的代码。
  • 为什么要给maxTemp()打两次电话?
  • ^ 那是你的错误。
  • 一般来说,你的程序是完全确定的(当错误被修复时),没有任何竞争条件。
  • 次要:for (int i = 0; i &lt; numOfTemps; i++) --> for (int i = 1; i &lt; numOfTemps; i++)。无需测试temps[0]

标签: c linux gcc


【解决方案1】:

这是你的问题:

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

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

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

其次,数组中的最高温度为 15.3 - 假设转换为 int 的值 15,您将遍历数组的末尾,进入垃圾。

确定你不是想把它称为

maxTemp( temperatures, 7 );

?

【讨论】:

  • 天啊!感谢您指出这一点。我责怪键盘驱动程序。
  • 有趣的是,-Wall 和 -Werror 并没有 - 让我感到悲伤。
  • @FiveBlue:嗯。好吧,在那种情况下我可能会弄错(不会是第一次,绝对不会是最后一次)。
【解决方案2】:

正如一条评论指出的那样,您在 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-array 之外的值。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多