2014-01-06 120 views
-2

考虑下面的代码:为什么访问这个指针会搞砸?

int* solve(int input[], int len) { 

    //Processing and building the calc array. Can be ignored. 

    int calc[3*(len-1)]; 
    calc[0] = input[0]; 
    calc[1] = 1; 
    calc[2] = 1; 
    for (int b = 1; b < len - 1; b++) { 
     calc[3*b] = 0; 
     calc[3*b + 1] = 0; 
     calc[3*b + 2] = 0; 
    } 
    if (input[0] < input[1]) { 
     calc[3] = input[1]; 
     calc[4] = 0; 
     calc[5] = 1; 
    } else { 
     calc[3] = input[0]; 
     calc[4] = 1; 
     calc[5] = 0; 
    } 
    for (int i = 2; i < len - 1; i++) { 
     for (int j = 0; j < i; j++) { 
      if ((i - j > 1 || calc[3*j + 2] == 0) && calc[3*j] + input[i] > calc[3*i]) { 
       calc[3*i] = calc[3*j] + input[i]; 
       calc[3*i + 1] = calc[3*j + 1]; 
       calc[3*i + 2] = 1; 
      } else if (input[i] > input[j] && calc[3*i] < calc[3*j] - input[j] + input[i]) { 
       calc[3*i] = calc[3*j] - input[j] + input[i]; 
       calc[3*i + 1] = calc[3*j + 1]; 
       calc[3*i + 2] = 1; 
      } else if (calc[3*i] < calc[3*j]) { 
       calc[3*i] = calc[3*j]; 
       calc[3*i + 1] = calc[3*j + 1]; 
       calc[3*i + 2] = 0; 
      } 
     } 


    } 

    //Printing the array 

    cout<<"Calc array: "; 
    for (int a = 0; a < len - 1; a++) { 
     cout<<"("<<calc[3*a]<<" "<<calc[3*a + 1]<<" "<<calc[3*a+2]<<") "; 
    } 
    cout<<endl; 

    //Returning a pointer to the array 

    int *pointer = calc; 
    return pointer; 
} 

int main() { 

    //Taking input. Can be ignored. 

    int len; 
    cin>>len; 
    int input[len]; 
    for (int i = 0; i < len; i++) { 
     cin>>input[i]; 
    } 

    //Assigning another pointer to the array that the solve() function returns. 

    int *a = solve(input, len); 
    int *b; 

    //Printing the array that the pointer points to. 

    cout<<"A Array: "; 
    for (int x = 0; x < len - 1; x++) { 
     cout<<"("<<a[3*x]<<" "<<a[3*x + 1]<<" "<<a[3*x+2]<<") "; 
    } 
    cout<<endl; 

    //Ignore code from here. 

    int c; 
    if (a[3*(len - 2) + 1] == 1) { 
     input[0] = -10*10*10*10; 
     b = solve(input, len); 

     if (b[3*(len - 2) + 2] == 1) { 
      if (input[len-1] > input[len-2]) { 
       c = b[3*(len - 2)] - input[len-2] + input[len - 1]; 
       cout<<c<<endl; 
      } else { 
       c = b[3*(len - 2)]; 
      } 
     } else { 
      c = b[3*(len - 2)] + input[len-1]; 
     } 
     if (c < a[3*(len - 2)]) { 

      cout<<a[3*(len - 2)]; 
     } else { 
      cout<<c<<endl; 
      cout<<a[3*(len - 2)]<<" "<<a[3*(len - 2) + 1]<<" "<<a[3*(len - 2) + 2]; 
      cout<<"This route"<<endl; 
     } 
    } else { 
     input[1] = -10*10*10*10; 
     b = solve(input, len); 
     if (a[3*(len - 2) + 2] == 1) { 
      if (input[len-1] > input[len-2]) { 
       c = a[3*(len - 2)] - input[len-2] + input[len - 1]; 
      } else { 
       c = a[3*(len - 2)]; 
      } 
     } else { 
      c = a[3*(len - 2)] + input[len-1]; 
     } 
     if (c > b[3*(len - 2)]) { 
      cout<<b[3*(len - 2)]; 
     } else { 
      cout<<c; 
     } 
    } 

} 

现在的问题这里,当我打印solve()函数内部的calc阵列它完美打印并在第一时间提供了以下所需的输出:

Calc array: (10 1 1) (10 1 0) (12 1 1) (15 1 1) (19 1 1) 

但是当我在main()函数中再次打印时,我得到以下输出:

A Array: (135712 0 1259266624) (2045 1 0) (4792936 0 32) (15 4792936 0) (2357952 0 4792936) 

我刚刚从Python迁移到C++,并且我发现它非常麻烦,有时这样。我尝试过对代码进行各种修改,但我仍然无法弄清楚问题所在。任何帮助,将不胜感激。

+4

看起来你正在返回一个指向局部变量的指针。这是一个很大的禁忌。 – Gabe

+0

你也没有返回一个指向数组的指针。这是指向第一个元素的指针。 – chris

回答

2

calc是一个局部变量,其生命期始于它的定义,并在函数退出时结束。

既然你退出函数时返回一个指针,以它的反引用所述指针是未定义行为(因为“对象”的背后它不再存在)。

如果你想有一个变量生存函数返回时,你需要做的是这样动态分配它,改变:

int calc[3*(len-1)]; 

到:

int *calc = new int [(3 * (len - 1)]; 

,然后确保你delete[]它在打电话给你的时候。

+0

那么,在这种情况下,我可以直接返回calc不能吗?而不是创建另一个指向它的指针? – Gerard

+0

@Gerard,是的,你可以返回'calc'本身,因为它是一个'int'指针。 – paxdiablo

相关问题