静态变量是全局变量吗?

时间:2016-05-13 16:25:25

标签: c++ file pointers printf runtime-error

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

}

任何人都可以帮助我吗?谢谢!

2 个答案:

答案 0 :(得分:1)

静态变量不等于全局,静态变量可以有范围:在编译单元,函数,类中。

对于问题#2,szData有31个字节但sprintf试图在它上面加上更多,所以它破坏了附近的东西。即使你让它静止,它也会破坏别的东西。

答案 1 :(得分:0)

在命名空间范围内声明的对象是static,这使得它在某种意义上是“全局的”。

在函数中声明并标记为static的对象由于其作用域的行为方式可能会被称为“全局”,但不能从函数外部访问它。

出于这个原因,你最好避免使用术语“全局”并坚持使用精确的标准C ++术语。

至于你的代码错误,你试图将超过31个字符放入31个字符的数组中。那只是不顺利。