变量占用的空间何时在c ++中解除分配?

deo*_*ngh 1 c++ scope

一旦从函数返回控件,变量占用的空间是否会被释放?

我以为它被解除了分配.

在这里,我编写了一个函数,即使在从函数CoinDenom返回数组的本地引用之后也能正常工作,使用它来打印命名总和所需的最小硬币数的结果.如果空间被解除分配,它如何能够打印出正确的答案?

int* CoinDenom(int CoinVal[],int NumCoins,int Sum) {
  int min[Sum+1];
  int i,j;
  min[0]=0;
  for(i=1;i<=Sum;i++) {
    min[i]=INT_MAX;
  }

  for(i=1;i<=Sum;i++) { 

    for(j=0;j< NumCoins;j++) {

      if(CoinVal[j]<=i && min[i-CoinVal[j]]+1<min[i]) {
        min[i]=min[i-CoinVal[j]]+1;
      }
    }
  }
  return min; //returning address of a local array
}

int main() {

  int Coins[50],Num,Sum,*min;
  cout<<"Enter Sum:";
  cin>>Sum;
  cout<<"Enter Number of coins :";
  cin>>Num;
  cout<<"Enter Values";
  for(int i=0;i<Num;i++) {
    cin>>Coins[i];
  }

  min=CoinDenom(Coins,Num,Sum);
  cout<<"Min Coins required are:"<< min[Sum];
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ric*_*dle 18

函数返回后,局部变量占用的内存内容是未定义的,但实际上它会保持不变,直到某些内容发生变化.

如果您更改代码以在填充内存然后使用它之间做一些重要的工作,您将看到它失败.


小智 7

你发布的不是C++代码 - 以下在C++中是非法的:

int min[Sum+1];
Run Code Online (Sandbox Code Playgroud)

但总的来说,您的程序表现出不确定的行为.这意味着任何事情都可能发生 - 它甚至可能起作用.

  • 这是有效的C99.如果Sum是常量,它将是有效的C++,但它是一个变量. (4认同)

Eri*_*lje 6

当函数返回时,该空间被"释放" - 但这并不意味着数据不在内存中.数据仍将在堆栈中,直到其他一些函数覆盖它为止.这就是为什么这些类型的错误是如此棘手 - 有时它会工作得很好(直到突然它没有)