1

我对 C 很陌生,我只是在玩,看看是否可以重新创建一个简单的子数组添加程序(找到数组中最大的连续子数组)。我遇到了一个奇怪的问题,如果我将n定义为整数并将其用作我的 for 循环中的条件,我将得到绝对的垃圾。

原谅这个奇怪的代码,我几乎只是复制并粘贴了一个我一直在玩弄的文件(很多额外的 printfs 等)。如果我运行它,对于 for 循环中的每个 printf 调用,我都会得到“4196053”或类似的输出。即使在第一次 printf 调用中(在进入循环之前),它似乎也被搞砸了。

#include <stdio.h>

int maxI (int a, int b)
{
        int max = (a >= b) ? a : b;
        return max;
}


int main (void)
{
    int array[] = { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5};
    int n = 11;
    int maxSoFar, i = 0;
    int maxHere = 0;
    printf ("%i\n", maxSoFar); //why is it screwing up here?

    for (i = 0; i < n; i++) {
            printf ("%i\n", maxSoFar);
            maxHere = maxI(maxHere + array[i], 0);
            maxSoFar = maxI(maxSoFar, maxHere);
    }
    printf ("The max is %i.\n", maxSoFar);
    return 0;
}

如果我只在条件中使用 11 而不是变量,它可以正常工作。有人知道这里发生了什么吗?

4

4 回答 4

1

maxSoFar有一些任意数据,所以你需要先初始化它

int maxSoFar = 0, i = 0;
     ^^Initialize to zero
于 2013-09-05T02:23:30.300 回答
0

你的错误在这里

int maxSoFar, i = 0

您从未声明过 maxSoFar,因此它使用的是垃圾数据。

将它初始化为0,你应该很好。

于 2013-09-05T02:23:24.063 回答
0

它给你一个垃圾值,因为你从不初始化maxSoFar. 这意味着它将具有当时留在内存中的任何值。

于 2013-09-05T02:26:01.620 回答
0

你的主要问题是这maxSoFar是一个本地(自动)变量,因此如果它没有被初始化,它将有一个不确定的值,所以这个程序的结果也是不确定的。修复方法是正确初始化maxSoFar,可能是array.

为了完整起见,C99 标准草案的相关部分是6.7.8 初始化第 10 段,其中说:

如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。[...]

于 2013-09-05T02:54:36.450 回答