制造一个愚蠢的记忆错误

时间:2013-02-06 06:20:00

标签: c++ memory-leaks

我很长一段时间没有使用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?感谢

3 个答案:

答案 0 :(得分: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; 

你在两个循环中都有同样的错误,确切地说,我认为很明显:)

答案 1 :(得分: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 == 3j == 0您正在访问atoms[30]时。 i >= 3越界时的任何访问。

答案 2 :(得分: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