堆栈上的价值腐败

时间:2017-04-22 19:48:30

标签: c++ garbage-collection

在下面的代码中,我发现在读取一定数量的输入后,N的值被替换(为0)。我相信这是发生的,因为我已经在堆栈上分配了K和S数组。我想知道我的结论是否正确?我过去常常在C中编码并切换到python和其他脚本语言。所以,在某些地方,我的记忆管理似乎已经折腾了。

ofstream cop("op1.txt");
ifstream cinp("in1.txt", ios::binary);
int T, t=1;
cinp >> T;
for(;t <= T;t++){
    fflush(stdin);
    long D;
    int N;
    long K[N], S[N];
    cinp >> D >> N;
    double times[N], max = 0;
    cout << D << " " << N << endl;
    for(long i=0; i<N; i++) {
        cout << D << " " << N << endl; // Output of this line is shown below till N gets replaced by 0
        cinp >> K[i] >> S[i];
        times[i] = (1.0 * (D - K[i]))/S[i];
        if(max < times[i])
            max = times[i];
    }
    cout << D << " " << N << endl;
    if(t == 3) {
        cout << D << " " << N << endl;
        for(int i=0;i<N;i++)
            cout << K[i] << " " << S[i] << endl;
    }
    cop << "Case #" << t << ": " << std::setprecision(6) << std::fixed << D/max << endl;
}

一瞥它何时被取代

912786011 100 <--- Needs to read 100 nos as N is 100
912786011 100
912786011 100
912786011 100
912786011 100
912786011 100
912786011 100
912786011 100
912786011 100
912786011 100
912786011 100
912786011 100
912786011 100
912786011 100
912786011 100
912786011 100
912786011 100
912786011 100
912786011 100
912786011 0 <---------------- Became 0

另外,我想知道我的结论是否正确,那么可以在堆栈上分配的内存量是多少(没有新内容)?

1 个答案:

答案 0 :(得分:0)

DeiDei说得对,你错误地使用了GCC的VLA扩展。

https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

  

在分配存储时计算一次数组的长度   并且在您访问它时会记住数组的范围   与sizeof。

因此,在声明数组之前,必须分配(并确保一定)用于size的变量具有适当的值。你没有,你走出了数组的边界,读取堆栈中的数据。如果这是一个函数,很可能在退出函数时触发了运行时错误。

可变长度对于此功能来说是一种误称,因为生成的数组不能改变大小,因此其使用非常有限。最好使用std :: vector,您可以使用提供的大小保留构造。 V99在C99中被允许,但在C ++中不是标准的,它们不能移植到其他C ++编译器。

相关问题