2012-10-17 150 views
0

我是C++的新手,需要編寫和調試語言的內存細微差別。誰能告訴我爲什麼下面的代碼給我一個分段錯誤?C++分段錯誤

string Polynomial::toString(){ 
    int i, exponent; 
    stringstream result; 

    for (i = 0; i < coeffs.size(); i++){ 

     // For first non-zero coefficient 
     if (result.str().empty()){ 
      if(coeffs[i] < 0) 
       result << "-"; 
      if(coeffs[i] != 0) 
       result << coeffs[i]; 
     } 
     else{ 
      if(coeffs[i] < 0) 
       result << " - " << abs(coeffs[i]); 
      else if(coeffs[i] > 0) 
       result << " + " << coeffs[i]; 
     } 

     exponent = (coeffs.size() - i - 1); 
     if (coeffs[i] != 0){ 
      if (exponent > 1) 
       result << coeffs[i] << "x^" << exponent; 
      else if(exponent == 1) 
       result << coeffs[i] << "x"; 
     } 
    } 

    result.str(); 
} 
+0

你能告訴我們在哪兒/如何coeffs'定義',你怎麼用值來填充它? – SingerOfTheFall

+0

請顯示更多的代碼(特別是所有相關類的聲明),編譯所有警告和調試信息(例如Linux上的'g ++ -Wall -g')並學習使用調試器(Linux上的'gdb')。 –

+7

也許這是你缺乏回報聲明。這會導致未定義的行爲,這肯定會崩潰。 – chris

回答

3

你可能會調用該函數,並將結果分配到的東西:

Polynomial p = ....; 
std::string s = p.toString(); 

既然你在Polynomial::toString()沒有return語句,這本身就是不確定的行爲,這很容易造成分段違例。您可以輕鬆地返回stringstreams的`字符串解決這個問題:

return result.str(); 
+0

謝謝你們,該死的Ruby教我壞習慣:) – clementine

1

您的函數缺少返回語句(可能只是return部分)。根據標準,除了main之外的任何函數,如果有返回類型,則到達大括號的結束大括號是未定義的行爲,如下所示的C++ 11標準的第6.6.2/2節所述,通常會導致崩潰它可能並不總是這樣做。

除此之外,沒有什麼會導致未定義的行爲或崩潰。你想要做的就是添加return部分:

return result.str(); 

對於它的價值,GCC 4.7.2提供了以下警告:

警告:在函數沒有返回語句,返回非空[ -Wreturn-type]

總是利用編譯器可以並且會給你的警告。


標準參考:

流動ÔFF的函數的結束相當於沒有值的返回;這會導致在返回值函數中定義 行爲。