簡體   English   中英

使用 c++ 偶爾檢測到 *** 堆棧粉碎***

[英]occasional *** stack smashing detected*** with c++

我有以下用於冒泡排序的 C++ 代碼。 此代碼編譯沒有任何錯誤,但是當我重新編譯並運行時,我得到

***檢測到堆棧粉碎***:終止

作為一個 C++ newby 我想知道,為什么運行時會出現這些偶發錯誤?

void bubbleSort(int eatenPanCakes[10],int arrSize){
 
    int temp=0;
    for(int i=0;i<arrSize-1;i++){
        for (int j = 0; j < arrSize-i; j++)
        {
            if (eatenPanCakes[j] > eatenPanCakes[j+1])
            {
                temp = eatenPanCakes[j+1];
                eatenPanCakes[j+1] = eatenPanCakes[j];
                eatenPanCakes[j] = temp;
            }
        }       
    }
}

環境: g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0

我的代碼中有一個錯誤: for (int j = 0; j+1 < arrSize-i; j++)將是正確的算法,並且可以正常工作。

參考 1 , 參考 2

您的程序正在訪問超出其大小的數組,這是未定義的行為。 檢查此循環for

for (int j = 0; j < arrSize-i; j++)

[我相信, arrSize值是10 ,因為eatenPanCakes數組的類型是int [10] ]

i0時, arrSize-i值為10並且在最后一次迭代中,當j值為9時,此語句

if (eatenPanCakes[j] > eatenPanCakes[j+1])

訪問eatenPanCakes數組的第j+1元素,它是索引10處的元素。 請注意,大小為10的數組將具有從09的有效索引。
相反, for循環中的條件應該是

for (int j = 0; j < arrSize - i - 1; j++)
                                ^^^

因為第j元素與數組中它前面的元素進行比較。

暫無
暫無

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

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