2017-09-22 65 views
2

我想用下一個代碼解決的問題是將某個大小的整數數組旋轉到某個數字。 例如,對於C++指針:數組的堆棧已損壞

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; 

,但我不明白,究竟是什麼錯。
在此先感謝您的幫助。

+0

就這麼你知道,這已經存在了:'std :: rotate' – chris

回答

6

a = &a[1];由1

移位指針a所以a[-1]a[3]包容現在有效索引的範圍:a[size - 1]違反了。

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

0

正如已經拔示巴所指出的,a = &a[1];(其具有完全一樣++a;a++;效果相同)移動與分配a[size - 1] = l;寫入存儲旁邊的陣列效果的指針。取決於調用rotate的代碼是否發生錯誤。我剛剛運行了rotate以及合適的main而沒有錯誤消息(無論是在編譯過程中還是在運行時)。

rotate不可能產生正確的輸出。它根本不會旋轉任何東西,只是簡單地將數組的一部分寫入數組旁邊的內存中。看起來好像有些東西是旋轉過來的,當數組有足夠的空閒內存時(否則數據被覆蓋)以及在代碼中調用rotate時也改變了數組的startadress。

爲了更好地理解程序在做什麼,我已經取代了一些語句與這樣具有完全相同的效果:

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]; 
    } 
} 

現在你可以很容易地看到,算法必須改變才能按要求工作。

+0

你的代碼在內存中移動數組,而不會將第一個數組推到末尾。所以你在輸入和輸出上有相同的數字行,而「a [size - 1] = l;」我旋轉一點線,添加先前的數字到數組的末尾。但我同意,這個額外的變量「L」並不是真的需要,解決方案也不是嚴格正確的。 – riverhare

+0

我剛剛重寫了您的代碼,以幫助您更好地理解它。這完全不是**問題的解決方案。重點是:你的代碼(和上面的問題一樣)**和我的答案中的代碼完全一樣。當你在循環中移動指針'a'時,就不會輕易看到它。 – Fabian