簡體   English   中英

C ++指針:數組的堆棧已損壞

[英]C++ pointers: stack for an array was corrupted

我要用下一個代碼解決的問題是將某個大小的整數數組旋轉到某個數字移位。 例如,對於

int a[5] = {1,2,3,4,5}

其中size =5 ,對於shift = 2 ,結果必須是

{3,4,5,1,2}

這是我的職責

void rotate(int a[], int size, int shift)
{
    for (int i = 0; i < shift%size; ++i) {
        int *buffer = &a[0];
        a = &a[1];
        int l = *buffer;
        a[size - 1] = l;
    }
}

輸出正確,但是有運行時異常

Stack around the variable 'a' was corrupted

問題肯定在

a[size - 1] = l;

但我不明白,到底是什么問題。
在此先感謝您的幫助。

a = &a[1]; 正在將指針a移1。

因此, a[-1]a[3]包括首尾)是有效索引的范圍: a[size - 1]違反了該范圍。

我建議不要改變a以這種方式。

正如拔示巴(Bathsheba)所述, a = &a[1]; (其效果與++a;a++;完全相同)移動指針,其作用是賦值a[size - 1] = l; 寫入數組旁邊的內存。 這取決於從該代碼rotate是否發生錯誤時被調用。 我剛剛與合適的main一起rotate運行,沒有錯誤消息(無論是在編譯期間還是在運行時)。

但是rotate不可能產生正確的輸出。 它根本不會旋轉任何東西,而只是將數組的一部分直接寫入數組旁邊的內存中。 似乎好像有一些旋轉的東西,當數組有足夠的可用內存(否則,數據將被覆蓋),並且當您更改數組的起始地址時,代碼也稱為rotate

為了更好地理解程序的作用,我用完全相同的效果替換了一些語句:

void rotate(int a[], int size, int shift) {
    for (int i = 0; i < shift%size; ++i) {
        // buffer was superfluous
        ++a;
        // l was superfluous
        a[size - 1] = a[-1];
    }
}

以下內容也與您的程序完全相同:

void rotate(int a[], int size, int shift) {
    for (int i = 0; i < shift%size; ++i) {
        a[size + i] = a[i];
    }
}

現在您可以輕松地看到,必須更改算法才能按要求工作。

暫無
暫無

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

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