带有函数调用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- 假设转换为 的int值15,您将遍历数组的末尾进入垃圾。
你确定你不是想把它称为
maxTemp( temperatures, 7 );
?