2016-09-05 12 views
2

配列が関数内で動的に宣言される次のコードがあります。次のプログラム、次のエラーコードで、配列を印刷中に、コードの切断を実行時に、しかしVisual Studioの2013年に完全にコンパイルされます。重大なエラーが検出さ0x771CC7C9(ntdll.dll)の処理されない例外

c0000374 WaveEquation1D.exeは、ブレークポイントをトリガしました。 WaveEquation1D.exeの0x771CC7C9(ntdll.dll)の最初の例外:0xC0000374:ヒープが破損しました(パラメータ:0x771F8890)。 WaveEquation1D.exeで0x771CC7C9(NTDLL.DLL)で

未処理の例外:0xC0000374:ヒープは(:0x771F8890パラメータ)破損しています。

何が起こっているのですか?

#include "stdafx.h" 
#include <iostream> 
#include <conio.h> 
#include <vector> 
using namespace std; 

int solver(double i, double v, double c, double L, int Nx, double C1, double t); 

int solver(double i, double v, double c, double L, int Nx, double C1, double t) 
{ 
    double *msh = new double(Nx); 
    double delta = L/Nx; 

    int count = 0; 
    for (int i = 0; i <= Nx; i++) 
    { 
     msh[i] = 0.0; 
    } 

    for (int i = 0; i <= Nx; i++) 
    { 
     msh[i] += delta*count; 
     count++; 
    } 


    for (int i = 0; i <= Nx; i++) 
    { 
     cout << msh[i] <<endl; 
    } 
    delete[] msh; 



// 

    return 0; 
} 



int main() 
{ 
    cout << "Hello"<<endl; 
    int size; 

    int j; 
    j = solver(1, 0, 0, 20.0, 20, 0, 1); 
    _getch(); 
    return 0; 
} 
+0

(パフォーマンスがあまりにもビットを受けるが、バグ)のベクトルが範囲外になった場合、アサーションが発生しますので、msh.at(i)であなたの要素にアクセス: '(I = 0をint型のために、私は< = Nx; i ++) 'となる。あなたの配列は 'Nx'要素を持っていて、' Nx + 1'を出力しています – Ari0nhh

答えて

5
double *msh = new double(Nx); 

double *msh = new double[Nx]; 

そうでないあなただけの1重にポインタを割り当てていなければなりません助けてください。他のユーザーが

をコメントとして

そして条件が
for (int i = 0; i <= Nx; i++) 

for (int i = 0; i < Nx; i++) 

よりよい解決策であるべき間違っている:の、deleteにダブル

#include <vector> 

std::vector<double> msh(Nx); // instead of new double 

不要の​​ベクトルを宣言しますもちろん、vectorは、変数g oesは範囲外です。

とこのループ条件が間違っている

+1

'for <ループ' i <= Nx; 'で条件を気付かなかったでしょう、' i

+0

2ミス!あなたが正しい。 –

関連する問題