簡體   English   中英

簡單C程序的奇怪輸出以找到數組中最大的連續子數組

[英]Strange output from simple C program to find the largest continuous subarray in an array

我是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而不是變量,則效果很好。 有人知道這是怎么回事嗎?

maxSoFar有一些任意數據,因此您需要先對其進行初始化

int maxSoFar = 0, i = 0;
     ^^Initialize to zero

您的錯誤在這里

int maxSoFar, i = 0

您從未聲明過maxSoFar,因此它正在使用垃圾數據。

將其初始化為0,就可以了。

它給您一個垃圾值,因為您從未初始化maxSoFar 這意味着它將具有那時存儲在內存中的值。

您的主要問題是maxSoFar是局部(自動)變量,因此,如果未初始化它,它將具有不確定的值,因此該程序的結果也是不確定的。 解決方法是正確初始化maxSoFar ,可能初始化為array的第一個元素。

為了完整起見,C99標准草案的相關部分為6.7.8 初始化第10段 ,其中指出:

如果未自動初始化具有自動存儲期限的對象,則其值不確定。[...]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM