2013-02-06 42 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