为什么这个价值在变化?

时间:2014-04-22 19:06:13

标签: c

我刚刚开始学习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]正在改变,任何人都可以帮忙?

5 个答案:

答案 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)