C++ 堆栈上的值损坏

C++ 堆栈上的值损坏,c++,garbage-collection,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(stdi

在下面的代码中,我发现在读取一定数量的输入后,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

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

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

阵列的长度在分配存储时计算一次 并记住数组的范围,以防您访问它 用sizeof

所以,在声明数组之前,必须赋值并确保用于大小的变量的值是正确的。您并没有这样做,并且您超出了数组的范围,读取堆栈中的数据。若这是一个函数,那个么很可能在退出函数时触发了运行时错误


可变长度对于这个特性来说有点用词不当,因为生成的数组不能改变大小,所以它的使用非常有限。最好使用std::vector,您可以使用提供的保留大小构造它。VL允许在C99中使用,但在C++中不是标准的,它们不可移植到其他C++编译器。

如果编译时不知道N,则不能声明长K[n]。更糟糕的是,即使您可以在运行时分配它,在分配数组之前,您甚至都不会读入N!可变长度数组在C++中是非法的,你可能使用一些编译器扩展,所以你应该把它们分配到堆上。假设它是有效的C++,它仍然是未定义的行为,因为N在使用之前没有被分配一个值。非常感谢各位。我完全漏掉了这一行。@VTT gcc和类似的扩展名VLA,默认情况下启用,除非pedantic mode engagedSwift。如果您可以将vector添加到堆栈上,而不受内存限制,并且编译器为用户处理内存,那就好了。vector使用动态内存。如果足够小,阵列可能会使用堆栈内存