我刚刚开始学习C语言。所以我做了一些练习,我遇到了这个问题。
代码:
#include <stdio.h>
#include <math.h>
main()
{
double l[2];
double s, v, d;
int i;
for (i = 0; i < 3 && l[i] >= 0; i++)
{
scanf("%lf", &l[i]);
if ( l[i] < 0)
{
printf("Please type a positive value\n");
l[i+1]=-1;
}
}
if (l[0] >= 0 && l[1] >= 0 && l[2] >= 0)
{
s = 2 * ((l[0] * l[1]) + (l[0] * l[2]) + (l[1] * l[2]));
v = l[0] * l[1] * l[2];
d = sqrt(pow(l[0],2)+pow(l[1],2)+pow(l[2],2));
printf("%.2f\n%.2f\n%.2f\n", s, v, d);
}
}
输出为&#34; s&#34;提供了正确的值,但它在&#34; s&#34;之后改变了l [2]值。存储,因此它给了我错误的值&#34; v&#34;和&#34; d&#34;。我不明白为什么l [2]正在改变,任何人都可以帮忙?
答案 0 :(得分:2)
定义
double l[2];
定义一个数组,其中包含2个double
类型值的空格。
可以使用l[0]
和l[1]
访问数组元素。访问l[2]
(正如您所做)是一个错误。
答案 1 :(得分:2)
访问l[2]
会导致未定义的行为。 C中的数组是0索引的,而l
只包含两个元素,即l[0]
和l[1]
。你的循环应该是:
for (i = 0; i < 2 && l[i] >= 0; i++)
你应该把这个大小存储在常量中。
答案 2 :(得分:1)
您的程序调用未定义的行为;
1.您正在读/写未分配的内存位置
2.在for
循环中,您正在阅读未初始化的变量。
答案 3 :(得分:0)
是的,为什么值正在改变的答案是,由于l [2]的内存位置没有分配给你的程序,它可能被分配给其他程序,这正在改变它的价值。即使你正在读一些东西,其他一些程序也试图再次改变它。 同样,如果您没有运行许多进程,代码仍然可以正常工作。这是因为,如果包含l [2]的内存块为空,则它不会随时间变化。 但是,从范围中访问变量是一种不好的做法,并且会在其他编译器中给出错误。
答案 4 :(得分:0)
错误在于访问l [2]
if(l [0]&gt; = 0&amp;&amp; l [1]&gt; = 0&amp;&amp; l [2] &gt; = 0)