【发布时间】:2014-03-09 00:06:52
【问题描述】:
我有一个在循环中声明的缓冲区。它在第一次迭代时被初始化。我最近在 Visual Studio 2010 调试中运行了代码,它在运行时错误时中断:Run-Time Check Failure #3 - The variable 'buffer' is being used without being initialized.
这里是一些示例代码。 It's also available on ideone where it runs successfully.
using namespace std;
int main( int argc, char *argv[] )
{
for( int i = 0; i < 5; ++i )
{
char buffer[5];
if(i == 0)
{
buffer[0] = 'y';
buffer[1] = '\0';
}
cout << buffer[0] << endl;
}
return 0;
}
我认为缓冲区不是在每次迭代时都重新创建的。我知道如果我有一个向量或其他东西,那么每次迭代都会调用构造函数,但我认为 C 类型或 POD 类型(如果这是正确的短语的话)是不同的。
Visual Studio 是正确还是错误,我有很多地方在循环的迭代 n 中更改了缓冲区,并且我希望该缓冲区在之后的迭代中相同,直到再次更改。他们在 gcc 中,但在最近的调试会话中,我猜这只是运气!
谢谢
编辑:在 codeguru 上发现了一个有趣的帖子,人们似乎对此意见不一:
Variable declaration inside a loop
【问题讨论】:
-
想知道您是如何想到存在“特殊情况”的。所有自动变量都以相同的方式处理,这是一件好事。
-
如果有
void f(int b) { int a = b; },那么每次调用函数时都会为变量a创建一个对象。没有什么特别的事情发生。对象是动态概念;变量是静态概念。变量在源代码中,对象在运行程序中。单个变量声明会导致许多对象的生命,这并不矛盾。
标签: c++ visual-studio-2010 gcc visual-studio-debugging