[英]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
- 假设它被转换为int
值15
,那么您将遍历数组的末尾变成垃圾。
你确定你不是要称之为
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.