2012-12-26 86 views
1

我一直在研究一些編碼,我遇到了分段錯誤。我盡了最大的努力使其工作,但我一直在失敗。現在我正在尋求幫助。這是我的代碼:C++程序得到分段錯誤

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 

    string symbols = "ABCDEFGHIJKLMNOPRSTUVYZ_"; 

    int sim, a = 0; 

    sim = symbols.size(); 

    string temp[sim]; 

    while(sim > 0) 
    { 
    sim--; 

    temp[sim] = symbols.substr(sim, 1); 

    cout << temp[sim] << endl; 
    } 

} 

那麼這種有用,但如果我做了一些改變,它崩潰。

更改:

while(sim > 0) 
    { 
    sim--; 

    temp[sim] = symbols.substr(sim, 1); 

    cout << temp[sim] << endl; 
    } 

要這樣:

while(a < sim) 
    { 
    a++; 

    temp[a] = symbols.substr(a, 1); 

    cout << temp[a] << endl; 
    } 

我得到SIGFAULT,我真的不明白,是錯誤的。我用調試器,它並沒有真正顯示它崩潰的線路,它只是顯示這個:

程序接收到的信號SIGSEGV,分段錯誤。

__gnu_cxx::__exchange_and_add(int volatile *, int)()()

+0

你知道在程序中的哪一點崩潰? (第一次嘗試運行,最後等) – Daniel

+1

只是爲了正確,它拼寫爲「segfault」。 「分段故障」的縮寫。 SIG什麼都有特定的含義 - 即它往往是一個常數,其值代表信號。在這種情況下,拼寫爲「SIGSEGV」。其中一個是合適的,但你應該選擇一個。 – cHao

+0

cHao - >好的,我會在下一次... 感謝您的支持,我感動了一個++;到循環結束,它工作正常,謝謝你們:) – iCoRe

回答

1

認爲當a == sim-1會發生什麼 - 你立即增加它,所以它成爲sim,然後訪問temp[a],雖然temp具有有效的索引0sim-1

我建議你溝渠語言擴展 - 即VLA的 - 並使用std::vector來代替。

0

你的一個temp [a]將得到一個從1到sim(包括)的索引。臨時數組具有sim元素,這意味着該數組的有效索引從0到sim-1(含)。

移動你一個++;成爲while循環中的最後一個語句,這將起作用。

1

a == sim-1將重新進入while循環,在a++使a == sim增加a,然後試圖訪問temp[a]時,它會崩潰。

您可以通過在while循環結束處增加a而不是開頭來修復此問題。

0

那麼,用temp [a]清楚地表明一個更微妙的問題是substr(a,1)在== sym的情況下會返回你賦給temp [a]的空字符串。這可能不會導致崩潰,但仍然是一個錯誤。