0

私はしばらくC++を使用していませんが、非常に愚かな間違いであると確信していることをしているようです。誰かが理由を教えてもらえますか

#include <cstdio>
#include <cstdlib>
#include <iostream>

using namespace std;

int main() {
        double* atoms;

        atoms = (double*)malloc(10 * 3*sizeof(double));
        for (int i = 0; i < 10; i++) {
                for (int j = 0; j < 3; j++) {
                        atoms[i*10 + j] = 2.0;
                }
        }

        for (int i = 0; i < 10; i++) {
                for (int j = 0; j < 3; j++) {
                        cout << atoms[i*10 + j] << endl;
                }
                cout << endl;
        }


        free(atoms);

        return 0;
}

印刷しています

2
2
2

2
2
2

2
2
2

6.94528e-310
6.94528e-310
0

0
4.24399e-314
4.24399e-314

2
2
2

2
2
2

2
2
2

2
2
2

2
2
2

すべての2の代わりに?ありがとう

4

3 に答える 3

3
    for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 3; j++) {
                    atoms[i*10 + j] = 2.0;

私はあなたが書きたかったと思います:

    for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 3; j++) {
                    atoms[j*10 + i] = 2.0; 

両方のループで同じ間違いがあります。正確には、それは明らかだと思いました:)

于 2013-02-06T06:25:18.963 に答える
1

malloc(10 * 3*sizeof(double))30倍に十分なメモリを割り当てます。

ループ:

    for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 3; j++) {
                    atoms[i*10 + j] = 2.0;
            }
    }

最後に割り当てられた要素()をはるかに超えてアクセスしますatoms[29]。たとえば、にアクセスi == 3しているとき。範囲外の場合のアクセス。j == 0atoms[30]i >= 3

于 2013-02-06T06:27:03.597 に答える
0

エラーはサイクル内にあります(両方):

for (int i = 0; i < 10; i++) {
      for (int j = 0; j < 3; j++) {
             atoms[i*10 + j] = 2.0;// <-- wrong index computation
      }
}

両方のサイクルで、代わりに次のようになります。

atoms[i*3 + j] = 2.0;

代わりは。各反復を出力するだけi*10 + jで、間違いがわかります。次の順序で要素にアクセスしようとしています。

0 1 2 10 11 12 20 21 22 30 31 32 40 41 42 50 51 52 60 61 62 70 71 72 80 81 82 90 91 92 2
于 2013-02-06T06:28:50.103 に答える