3

発生し続けるこの奇妙なエラーを表示するために、コードをできる限り削減しました。

私はここにうまく動作するプログラムを持っています:

#include <iostream>
using namespace std;
int main() {
    int * elements;
    // int size = 10;
    for(int i = 0; i < 10; i++) {
        elements[i] = 0;
    }
    for(int i = 0; i < 10; i++) {
        cout << "Hi";
    }
    return 0;
}

ただし、コメント行のコメントを外すとすぐに、すべてがクラッシュします。何も印刷されず、プログラムが応答を停止したというエラーが表示されます。変数名を変更しても、プログラムには影響しません。

これは今まで見たことのない奇妙なエラーです。誰かが何らかの助けを提供できれば、それは大歓迎です。

編集:要素にメモリを割り当てるのを忘れていたことがわかりました。ただし、「int size = 10」と入力すると、プログラムのクラッシュがどのように停止したのか、まだわかりません。

4

3 に答える 3

7

未使用の整数は問題とは関係ありません。

elementsポインタにメモリを割り当てていません。この初期化されていないポインターから 10 個の要素にアクセスしようとします。あなたのプログラムには未定義の動作があり、動作しているように見えても間違っています。

ただし、「int size = 10」と入力すると、プログラムのクラッシュがどのように停止したのか、まだわかりません。

未定義の動作とは、何かが起こる可能性があることを意味し、コードの一部が実際の問題のあるコードと明確な関係がなくても、一見無害に見えるコードの一部がプログラムの動作を変える可能性があります。そのため、動作は「未定義」と呼ばれます。

于 2013-11-10T01:59:57.357 に答える
1

コメントアウトはintあなたのエラーとは何の関係もありません。

elementsポインタ(配列)にメモリを割り当てていません:

  int * elements;

へのポインタを宣言しますint。ただし、整数の配列にはスペースが割り当てられません。

所有していないメモリへのアクセスは未定義の動作です。

于 2013-11-10T01:59:03.103 に答える
1

要素を格納するためのメモリを割り当てるのを忘れました。その結果、適切に準備されていないメモリにアクセスすると、未定義の動作が発生し、何かが起こる可能性があります。vector代わりに、ポインターよりもはるかに簡単で安全な s の使用を検討する必要があります。

#include <iostream>
#include <vector>  //  You must include this to get vectors
using namespace std;
int main() {
    vector<int> elements(10); // to create space for 10 ints
    // int size = 10;
    for(int i = 0; i < 10; i++) {
        elements[i] = 0;
    }
    for(int i = 0; i < 10; i++) {
        cout << "Hi";
    }
    return 0;
}

また、はベクトルのサイズを自動的にチェックし、十分な大きさであることを確認するため、 のelements.at(i) = 10代わりに使用する方が安全です。の場合、チェックは実行されません。elements[i] = 10at[i]

于 2013-11-10T02:00:14.757 に答える