簡體   English   中英

當我添加一條語句時,C ++中的錯誤輸出結果

[英]A wrong result output in C++, when I add a statement

我嘗試在一次遍歷中使用3 * (n // 2)次比較來查找數組(大小為n)中的最小值和最大值。 這是我的代碼:

#include <iostream>
#include <initializer_list>
//!
//! @Brief:get the minmum and maxmum in 3 * ( n // 2) times comparison.
//! Create by Soyn. 31/7/15.
//!

    bool IsOdd( size_t n)
    {
        return n % 2 ;
    }
    std::initializer_list<int> getLargerAndSmaller( int a, int b)
    {
        if(a <= b){
            return {a,b};
        }else{
            return {b,a};
        }
    }

    int main(void)
    {
        int  Min, Max;
        int a[] = {5,4,1,7,3,8,3,4,9,10};
        int n = sizeof(a) / sizeof(a[0]);
        for( int i = 0; i < n - 1; i += 2){
            if( (i ==0) &&IsOdd(n)){           // initialize the Min and Max.
                Min = Max = a[i];
            } else{
                    auto item = getLargerAndSmaller(a[i],a[i+1]);
                    if(i == 0){
                            Min = *(item.begin());
                            Max = *(item.begin() + 1);
                            std :: cout << "Min: " << Min << " , " << "Max: " << Max << std :: endl;
                        }else{
                        std :: cout << *(item.begin()) << " , " << *( item.begin() + 1) << std :: endl;
                        Min > *(item.begin()) ? Min = *(item.begin()) : Min;
                        Max < *(item.begin() + 1) ? Max = *(item.begin() + 1) : Max;
                        std :: cout << "Min: " << Min << " , " << "Max: " << Max << std :: endl;
                        }
            }
        }
         return 0;
    }

為了測試我的代碼,我在代碼中添加了一些語句,例如

std :: cout << *(item.begin()) << " , " << *( item.begin() + 1) << std :: endl;

這是我不知道的要點。 當我添加它時,結果是錯誤的。 如果我清除它,則效果很好。 以下是錯誤的結果圖片:

在此處輸入圖片說明

函數返回std::initializer_list幾乎永遠是不正確的,因為它們引用本地數組。

當您寫return {a, b}; ,或等效地用於說明:

std::initializer_list<int> x = { a, b };
return x;

發生的情況是,創建了a由2個元素組成的自動(堆棧)數組,其中包含ab副本; 並且initializer_list對象保存對該本地數組的引用。

因此,當您訪問item您正在訪問的是懸空引用(未定義的行為)。


initializer_list並非旨在用作容器-而是使用arrayvectorpair等。

暫無
暫無

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

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