2016-05-13 244 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个字符的数组中。这不会很顺利。