2013-02-06 23 views
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的?由于

+1

您是否使用调试器?请注意,在第二个循环中,“i”可以是9,然后您正在处理索引90的元素,该元素溢出“malloc”区域。 –

+3

只需使用向量的'std :: vector'并保存自己的困惑。 –

+0

此外,允许malloc返回NULL。 – SecurityMatt

回答

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超出范围时将进行任何访问。

+0

嘎,谢谢。抱歉。我一直在编码过去的12个小时,盯着最后20分钟试图弄清我做错了什么愚蠢的事情。 – Nick

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; 

你有同样的错误,在这两个循环,准确的说,我认为这是明显的:)

+2

Max i = 9,max j = 2; j * 10 + i = 20 + 9 = 29,什么符合分配的内存,我错过了什么? – Spook

+0

不,今天好像很慢.. –

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