Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么访问时这个指针会出错?_C++ - Fatal编程技术网

C++ 为什么访问时这个指针会出错?

C++ 为什么访问时这个指针会出错?,c++,C++,考虑以下代码: 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

考虑以下代码:

    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;
        }
    }

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

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

我刚刚从Python迁移到C++,我发现它非常麻烦,有时会出现这种情况。我已经尝试了对代码的各种修改,但我仍然无法找出问题所在。任何帮助都将不胜感激

calc
是一个局部变量,其生存期从定义开始,到函数退出时结束

由于您在退出函数时返回指向它的指针,因此对该指针的取消引用将是未定义的行为(因为它后面的“对象”不再存在)

如果希望变量在函数返回后继续存在,则需要执行动态分配、更改:

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


然后确保在处理完后在调用者中删除[]。

这看起来像是在返回一个指向局部变量的指针。这是一个很大的禁忌。您也没有返回指向数组的指针。它是指向第一个元素的指针。所以,在这种情况下,我可以直接返回calc,不是吗?不是创建另一个指向它的指针?@Gerard,是的,您可以返回
calc
本身,因为它是
int
指针。
int calc[3*(len-1)];
int *calc = new int [(3 * (len - 1)];