静态变量是全局变量吗?

Did a static variable is global variable?

我有两个 C++ 问题。

首先,全局变量和静态变量是一回事吗?静态变量有什么讲究?

其次,我实际上编写了一个项目,如果我不使用静态变量,我的代码会向我发送下一个错误:

Run-Time Check Failure #2 - Stack around the variable 'szData' was corrupted.

这个错误是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;
        }
    }

}

谁能帮帮我?谢谢!

在命名空间范围内声明的对象是 static,从某种意义上说,它是 "global"。

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

因此,您最好避免使用术语 "global" 并坚持使用精确的标准 C++ 术语。

至于您的代码错误,您试图将超过 31 个字符放入 31 个字符的数组中。这不会很顺利。

静态变量不等于全局,静态变量可以有作用域:编译单元内,函数内,class.

对于问题 #2,szData 有 31 个字节,但 sprintf 尝试在其上放置更多字节,因此它破坏了附近的东西。即使您将其设为静态,它也会破坏其他内容。