c++;错误int i=0不工作 在C++代码中,由于某些原因,int i=0不工作。在调试模式下,它在超出范围后将1024存储到i中。当我尝试将其声明为0时,它不起作用。i不是一个全局变量 void CCurrent::findPeaks()//this checks for peaks in the FFT { int localPeakIndx[256]={}; int j=0; for(int i=0;i<DATASIZE/2;i++) { if(magnitude[i]>m_currentValues.AverageMagnitude*3) { localPeakIndx[j]=i; j++; } } //i should be out of scope int startIndx; int endIndx; int i = 0;//why does it equal 1024?????? debug* void CCurrent::findPeaks()//这将检查FFT中的峰值 { int localPeakIndx[256]={}; int j=0; 对于(int i=0;im_currentValues.AverageMagnitude*3){ localPeakIndx[j]=i; j++; } } //我应该在范围之外 int startIndx; int-endIndx; int i=0//为什么它等于1024??????调试*

c++;错误int i=0不工作 在C++代码中,由于某些原因,int i=0不工作。在调试模式下,它在超出范围后将1024存储到i中。当我尝试将其声明为0时,它不起作用。i不是一个全局变量 void CCurrent::findPeaks()//this checks for peaks in the FFT { int localPeakIndx[256]={}; int j=0; for(int i=0;i<DATASIZE/2;i++) { if(magnitude[i]>m_currentValues.AverageMagnitude*3) { localPeakIndx[j]=i; j++; } } //i should be out of scope int startIndx; int endIndx; int i = 0;//why does it equal 1024?????? debug* void CCurrent::findPeaks()//这将检查FFT中的峰值 { int localPeakIndx[256]={}; int j=0; 对于(int i=0;im_currentValues.AverageMagnitude*3){ localPeakIndx[j]=i; j++; } } //我应该在范围之外 int startIndx; int-endIndx; int i=0//为什么它等于1024??????调试*,c++,debugging,optimization,int,C++,Debugging,Optimization,Int,不清楚您所说的“int i=0不工作”和“它在超出范围后将1024存储到i中”是什么意思。这种描述是不现实的,很可能不会发生。在int i=0之后,i的值将被视为0,而不是1024 在这种情况下,您需要记住的是,您的程序有两个i变量:一个是本地到的变量,一个是在周围的块中声明的。这是两个完全不相关的不同变量 现在,MS Visual Studio debugger将向您显示当前块中声明的所有变量的值,即使执行尚未达到声明点。预期的是,尚未达到声明(和初始化)点的变量显示为不确定(未初始化)值 显

不清楚您所说的“int i=0不工作”和“它在超出范围后将1024存储到i中”是什么意思。这种描述是不现实的,很可能不会发生。在
int i=0
之后,
i
的值将被视为
0
,而不是
1024

在这种情况下,您需要记住的是,您的程序有两个
i
变量:一个是本地到
变量,一个是在周围的块中声明的。这是两个完全不相关的不同变量

现在,MS Visual Studio debugger将向您显示当前块中声明的所有变量的值,即使执行尚未达到声明点。预期的是,尚未达到声明(和初始化)点的变量显示为不确定(未初始化)值

显然,这正是你的情况。您正在查看外部
i
在其声明和初始化点之前的值。即使从语言的角度来看,在
for
循环之后,名称
i
仍然不可见,调试器仍将为您提供对外部
i
的“早期访问”。在你的实验中,
i
的垃圾值恰好是
1024

请注意,在这种行为中有一定的确定逻辑。在一般情况下,假设本地对象在其声明点上方不存在是不正确的。在空间上位于声明点之上并不一定意味着在时间上位于声明点之前,这一点在您开始使用该语言的优美功能(如
goto
)后变得很清楚

例如,这段代码

{
  int *p = NULL;

above:
  if (p != NULL) {
    std::cout << *p << std::endl;
    goto out;
  }

  int i = 10;
  p = &i;
  goto above;

out:;
}
{
int*p=NULL;
以上:
如果(p!=NULL){

std::cout只是对已经说过的话的一个小小的改进:

当输入函数时,“外部i”与所有其他局部变量一起在堆栈上给定空间

由于在
for
循环结束之前没有给“outer i”赋值,因此调试器正在查看
i
的值应该在哪里的堆栈,并向您显示发生了什么

这是因为局部变量没有初始化


我敢打赌,如果您在声明之前尝试从C访问I,编译器会将其标记为错误。但调试器没有这样的顾虑。

您的证明是1024的证据在哪里?“在调试模式下,它在超出范围后将1024存储到I中”-你怎么知道的,为什么在它超出范围后要尝试使用它的值?另外,第二个
i
与循环中使用的不同。我知道它是1024,因为它说在调试模式下使用visual studio 2010时它是1024。@Bobby First,调试器不是证据。你可能误用了调试器,你可能是debu发布版本,谁知道呢。如果你想要证明,那么简单的
cout怎么样