2017-04-22 12 views
-3

以下のコードでは、一定数の入力を読み込んだ後、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 

を置き換えられますときの片鱗)?

+0

コンパイル時に 'N 'がわからない場合、' long K [N] 'を宣言することはできません。さらに悪いことに、実行時に割り振ることができたとしても、配列を割り当てた後でなければ、 'N'で読み込むことさえできません! – CoryKramer

+0

可変長配列はC++では不正です(コンパイラの拡張機能を使用している可能性があります)ので、ヒープに割り当てる必要があります。 – VTT

+0

有効なC++だとしましょう。Nは使用前に値が割り当てられていないため、未定義の動作です。 – DeiDei

答えて

0

DeiDeiは正しく、GCCのVLA拡張を間違って使用したと言っています。

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

ストレージが を割り当てられ、あなたのsizeofでそれ にアクセスする場合には、アレイの範囲のために記憶されている場合、配列の長さは、一度計算されます。

したがって、配列を宣言する前に、sizeに使用されている変数が適切な値であることを確認してください(そして必ず確認してください)。あなたはそうしなかったし、配列の範囲外に出て、スタック内のデータを読み取った。これが関数の場合は、関数の終了時に実行時エラーが発生した可能性があります。

可変長は、結果として得られる配列がサイズを変更できないため、この機能には間違いがあります。 std :: vectorを使うのがベストです。用意されているサイズで構築できます。 VLAはC99では許可されていましたが、C++では標準ではないため、他のC++コンパイラには移植できません。

+0

ベクタをスタックに追加してメモリにバインドしないようにすると、またコンパイラがメモリをユーザのために処理できるようにすることができます。 – suraj

+0

ベクトルはダイナミックメモリを使用します。 std :: array _may_もし十分に小さいならスタックメモリを使う – Swift

関連する問題