2016-05-01 171 views
-1

正直なところ、これについて何か間違っているとは言えません。私は同様の問題を持つスレッドを読んだことがありますが、人々はメモリや物事の割り当てを扱っています。これはこれまでプログラマーとしての範囲を超えていて、私のプログラムはそれほど複雑ではありません。 0x00363A09で未処理の例外が発生しました。スタッククッキーインストルメンテーションコードがスタックベースのバッファオーバーランを検出しました

int main() { 
double input[5] = { 5.0, 6.0, 8.0, 4.3, 5.6 }; 
GradeBook test(sizeof(input), input); 


test.bubbleSort(); 
test.printAll(); 



return 0; 
}; 

は、これらは私のプライベートなデータメンバー私の評定表のクラスのための

const static int gradeBookSize = 6; 
int classSize; 
double grades[gradeBookSize]; 
bool insertionSorted = false; //simply for efficency 
bool bubbleSorted = false; 

コンストラクタです

GradeBook(int inputSize, double inputGrades[]) { 
    classSize = inputSize; 
    for (int i = 0; i < classSize; i++) { 
     grades[i] = (inputGrades[i]); 
    } 
    for (int i = classSize; i < sizeof(grades); i++) { 
     grades[i] = 0; 
    } 

} 

そして最後に、アイブ氏は、実際に私のmain()メソッドで使用される2つのメソッド

void bubbleSort() { 
    //sorts grades in descending order using bubblesort algorithm 
    bool sorted = false; 
    while (!sorted) { 
     for (int i = 0; i < (sizeof(grades) - 1); i++) { 
      if (grades[i] < grades[i + 1]) { 
       double tmp = grades[i + 1]; 
       grades[i + 1] = grades[i]; 
       grades[i] = tmp; 
      } 
     } 
     bool test = false; 
     for (int i = 0; i < sizeof(grades) - 1; i++) { 
      if (grades[i] < grades[i + 1]) test = true; 
     } 
     sorted = !test; 
    } 


    bubbleSorted = true; 
    insertionSorted = false; 
} 

void printAll() { 
    for (int i = 0; i < sizeof(grades); i++) { 
     cout << grades[i] << "\t"; 
    } 
    cout << endl; 
} 

私たちは私のデバッグ出力を持って再、私はこの

The thread 0x3378 has exited with code 0 (0x0). 
Unhandled exception at 0x0130FC38 in CS260_Project4_James_Casimir.exe:0xC00001A5: An invalid exception handler routine has been detected (parameters: 0x00000003). 

CS260_Project4_James_Casimir.exe has triggered a breakpoint. 

Run-Time Check Failure #2 - Stack around the variable 'test' was corrupted. 

Unhandled exception at 0x00363A09 in CS260_Project4_James_Casimir.exe: Stack cookie instrumentation code detected a stack-based buffer overrun. 

Unhandled exception at 0x00363A09 in CS260_Project4_James_Casimir.exe: Stack cookie instrumentation code detected a stack-based buffer overrun. 

Unhandled exception at 0x00363A09 in CS260_Project4_James_Casimir.exe: Stack cookie instrumentation code detected a stack-based buffer overrun. 

The program '[7400] CS260_Project4_James_Casimir.exe' has exited with code 0 (0x0). 
+1

'のはsizeof(グレード)' - あなたはこれがどうなるかだと思いますか?それはあなたが期待するものではありません。実際、 'sizeof(input)'のように、どこで使っても間違って使います。 – PaulMcKenzie

+0

@PaulMcKenzie私はそれがjavaの.size()関数に似ていると思った。これは本当に何をしてくれるのですか? –

+1

'sizeof(T)'は、 'T'型が配列内の項目の数ではなく**バイト**の数を返します。 C++はJavaではありません - JavaをモデルとしてC++を試してみませんか? – PaulMcKenzie

答えて

1

主な問題は、sizeofを間違って使用していることです。 sizeofキーワードは、バイトの数を返します。タイプは配列内の項目数ではなく、配列数で構成されます。あなたのコードで何が起こって巻き取る何

ではなく、配列内の項目の数、あなたが実際にどの意志以上

sizeof(double)*6

grades配列の場合)を使用しているということですおそらく48個(配列内の6個のアイテム、各アイテムは8バイトです)です。問題は明らかに、あなたのループが何回も繰り返され、配列アクセスの範囲外のメモリアクセスを引き起こします(そして、あなたが見ることができるように、クラッシュします)。型が配列である場合

は、その後、sizeofを使用してgrades配列内の項目の数は、次のようになります。

sizeof(grades)/sizeof(grades[0])

だから、バイト1エントリの数で割ったバイト数を占めるのです。


あなたは上記よりもより直感的な何かをしたい場合は、std::arrayを使用すると、あなたにこれを与える:

#include <array> 
#include <iostream> 

std::array<double, 6> grades; 
int main() 
{ 
    std::cout << grades.size(); // will output 6. 
} 
1

sizeof(x)の頭や尾を作ることができない大きさの文字オブジェクトxのでを返し、場合x内の要素の数ではなく、配列です。

関連する問題