我在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 :(得分:1)
静态变量不等于全局,静态变量可以有范围:在编译单元,函数,类中。
对于问题#2,szData有31个字节但sprintf
试图在它上面加上更多,所以它破坏了附近的东西。即使你让它静止,它也会破坏别的东西。
答案 1 :(得分:0)
在命名空间范围内声明的对象是static
,这使得它在某种意义上是“全局的”。
在函数中声明并标记为static
的对象由于其作用域的行为方式可能会被称为“全局”,但不能从函数外部访问它。
出于这个原因,你最好避免使用术语“全局”并坚持使用精确的标准C ++术语。
至于你的代码错误,你试图将超过31个字符放入31个字符的数组中。那只是不顺利。