2016-05-13 3 views
0

C++には2つの質問があります。静的変数はグローバル変数ですか?

まず、グローバル変数は静的変数と同じですか?静的変数の特質は何ですか?

は第二に、私は実際に私は静的変数を使用しない場合は、プロジェクトをコーディングして、私のコードは私に次のエラーが送ら:

ランタイムチェックの失敗#2 - 変数の周りスタック「szDataを」でした が壊れています。私はそれを削除し、すべてがOKですので

このエラーは、原因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

'ficCar'を閉じて失敗しなかった場合は、コード – user463035818

+0

に「静的」という文字列は表示されません。失敗した場合にのみ使用し続けます。 – user463035818

+0

おっと!私は間違いをします。私はSOのコードを編集しました。それは静的なchar szDataです。 – SurveyVisual

答えて

1

静的変数はグローバル変数と同じではなく、静的変数はコンパイル単位、関数、クラス内でスコープを持つことができます。

質問2の場合、szDataは31バイトですが、sprintfはそれ以上を置くようにして、近くのものを壊します。あなたが静かにしても、それは他の何かを壊すでしょう。

+0

この回答をありがとうCalvin!これは私を大いに助ける!私はちょうど私の配列に2を追加し、私はメモリについてのエラーはもうありませんでした!ありがとう! :) – SurveyVisual

0

名前空間のスコープで宣言されたオブジェクトはstaticであり、ある意味では「グローバル」になります。

関数内で宣言され、staticとマークされたオブジェクトは、そのスコープの振る舞いのために「グローバル」と呼ばれることがありますが、関数の外部からアクセスすることはできません。

このような理由から、「グローバル」という用語を避け、正確な標準C++用語に従うことをお勧めします。

コード違反は、31文字を31文字の配列に配置しようとしています。それだけでうまくいくわけではありません。

関連する問題