2016-05-13 8 views
0

Ich habe zwei Fragen in C++.War eine statische Variable eine globale Variable?

Erstens, ist eine globale Variable die gleiche wie eine statische Variable? Was ist an einer statischen Variable besonders?

Zweitens bin ich der Code tatsächlich ein Projekt, und wenn ich nicht statische Variable nicht verwenden, meinen Code schickte mir den nächsten Fehler:

Run-Time Check Failure # 2 - um die Variable Stack 'szData' war beschädigt.

Dieser Fehler aufgrund sprintf erscheinen, weil ich es entfernen und alles ist ok ..

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

} 

Wer kann mir helfen? Vielen Dank!

+0

Ich kann keine 'statische' in diesem Code – user463035818

+0

finden, wenn' ficCar' nicht fehlgeschlagen ist, schließen Sie es und zurück und nur wenn es fehlgeschlagen ist, verwenden Sie es weiter, ist das wirklich was Sie wollen? – user463035818

+0

Hoppla! Ich mache einen Fehler. Ich habe meinen Code auf SO bearbeitet, es ist ein statisches Zeichen szData [31]; – SurveyVisual

Antwort

1

statische Variable ist nicht gleich global, statische Variable kann Bereich haben: innerhalb der Kompilierungseinheit, Funktion, Klasse.

Für Frage # 2, szData hat 31 Bytes, aber sprintf versuchen, mehr darauf zu setzen, so dass es Dinge in der Nähe beschädigt. Selbst wenn Sie es statisch machen, wird es etwas anderes verfälschen.

+0

Danke für diese Antwort Calvin! Das hilft mir sehr! Ich füge gerade 2 zu meiner Reihe hinzu und ich hatte keinen Speicherfehler mehr! Vielen Dank! :) – SurveyVisual

0

Ein im Namespace-Bereich deklariertes Objekt ist static, und das macht es in gewisser Weise "global".

Ein Objekt, das in einer Funktion deklariert und mit static markiert wurde, könnte wegen der Art und Weise, wie sich sein Bereich verhält, als "global" bezeichnet werden, aber von außerhalb der Funktion kann nicht darauf zugegriffen werden.

Aus diesem Grund wäre es besser, den Begriff "global" zu vermeiden und sich an die präzise C++ - Terminologie zu halten.

Wie bei Ihrem Code-Fehler versuchen Sie, mehr als 31 Zeichen in einem Array von 31 Zeichen zu setzen. Das wird einfach nicht gut gehen.