2016-05-13 182 views
0

我在C++中有兩個問題。一個靜態變量是全局變量嗎?

首先,是一個全局變量和靜態變量一樣嗎?靜態變量有什麼特別之處?

其次,我居然代碼的項目,如果我不使用靜態變量,我的代碼給我發了一個錯誤:

運行時檢查失敗#2 - 堆棧圍繞變量「szData」是 損壞。

這個錯誤出現因sprintf的,因爲我刪除它,一切都確定..

bool CreateFile(MyCards** ppCards) 
{ 
    fstream ficCar; 
    static char szData[31]; 
    ficEmployes.open("./my_cards.dat", ios::in | ios::binary); 

    if (!ficCar.fail()) 
    { 
     ficCar.close(); 
     return false; 
    } 
    else 
    { 
     sort(ppCards, ppCards + 26271, OrderedCards); 
     ppCards.open("./nom_cartes.index", ios::out | ios::binary); 

     if (ficCar.fail()) 
     { 
      throw "Error"; 
     } 
     else 
     { 

      for (int indice = 0; indice < 10123; indice++) 
      { 
       sprintf(szData, "%-20s %010d \n", 
        ppCards[indice]->GetNom(), 
        ppCards[indice]->GetPosition()); 

       ficCar.write(szEnregistrement, 30); 

      } 

      ficCar.close(); 

      return true; 
     } 
    } 

} 

任何人都可以幫我嗎?謝謝!

+0

我無法發現該代碼中的任何'靜態' – user463035818

+0

如果'ficCar'沒有失敗你關閉它並返回,只有當它失敗時,你繼續使用它,這真的是你想要的嗎? – user463035818

+0

糟糕!我犯了一個錯誤。我編輯了我的代碼,它是靜態字符szData [31]; – SurveyVisual

回答

1

靜態變量不等於全局靜態變量可以有範圍:在編譯單元,函數,類中。

對於問題#2,szData有31個字節,但sprintf試圖放在它上面,所以它破壞附近的東西。即使你把它變成靜態的,它也會腐蝕別的東西。

+0

感謝您的回答卡爾文!這幫助我很多!我只是將2添加到我的數組中,並且我沒有更多關於內存的錯誤!謝謝! :) – SurveyVisual

0

在名稱空間範圍聲明的對象是static,這使得它在某種意義上成爲「全局」。

在函數中聲明並標記爲static的對象由於其作用域的行爲方式而可能被稱爲「全局」,但無法從函數外部訪問。

由於這個原因,避免使用術語「全局」並堅持使用標準C++術語是精確的。

至於你的代碼錯誤,你試圖把超過31個字符放入31個字符的數組中。這不會很順利。