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 == 0访问atoms[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 回答