2017-04-02 60 views
3

我在C++代碼中遇到了一個內存問題,當然我錯了,但是我沒有遇到問題。我已經聲明瞭一個三指針數組來加倍和分配內存。C數組指針加倍

double *myDoubles[3]; 

for(int i=0;i<3;i++) { 
    myDoubles[i]= (double *) malloc(1000*sizeof(double)); 
} 

myDoubles[2][999]=10.55; 

怎麼了?

編輯

由於@EdHeal意見,但也@PhilippKiener我不應該使用malloc在所有。但在25年之前很難忘記malloc。 畢竟我的問題是另一個地方的另一個錯誤,實際上我寫的是限制:)。我的錯!

+1

在C中,你不會投'malloc' - 這是不好的 - 見http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc –

+0

什麼是本質內存問題,你正在得到? – Jay

+0

@Jay問題是,當我使用double操作時,我得到了其他變量中的內存損壞,但我看起來並不像我正在做一個索引,例如myDoubles [2] [1000]或類似的東西。 – Mquinteiro

回答

1

首先第一件事情:不轉換指針malloc回報。 void*(在你的情況下)double*是隱含的(和預期的),明確地轉換它通常被認爲是不好的做法。

現在解決您的問題; malloc分配給定數量的字節並返回指向這些字節的指針。您分配了1000個字節,但您想要的是爲1000 double s分配足夠的字節。你錯誤的原因是double大於一個字節 - 它是8個字節。您可以通過sizeof(type)獲得類型的大小;爲您的1000 double小號分配足夠的內存,你會因此不得不改變線路內循環到:

myDoubles[i] = malloc(1000 * sizeof(double)); 

要了解你的系統的類型的大小,你可以把

printf("Size of double: %d", sizeof(double)); 

在你的代碼中。

編輯:

現在,因爲你用C++的工作,你不應該使用malloc可言。 C++使生活更輕鬆,並給你new

的分配行應

myDoubles[i] = new double[1000]; 

的好處華南簡介新鮮的是,它並不需要的尺寸提供...你給它一個類型和量;它計算你需要的字節。但要注意,而不是free你應該使用

delete[] myDoubles[i]; 
+0

對不起@PhilippKiener我確實問題不好。錯誤的標籤,以及malloc例子中的錯誤,在代碼中它是可以的。我必須演員,因爲是C++ – Mquinteiro

2

您每次分配1000個字節而不是1000個雙倍。 你應該做的是:

malloc(1000 * sizeof(double)); 

你完整的代碼應該是這樣的:

double* myDoubles[3]; 
for(int i = 0; i < 3; i++) { 
    myDoubles[i] = (double*) malloc(1000 * sizeof(double)); 
} 
myDoubles[2][999] = 10.55; 
+0

對不起,我想分配三個1000雙打數組。問題不在於代碼中未包含的* sizeof(double)的問題。 – Mquinteiro

+1

不需要施放'malloc'返回值。 – nnn

+0

對不起@nnn我的標記c不對,它必須是C++ – Mquinteiro

1

當您使用C++,使用std::vector - 見here

所以代碼變得

std::vector<std::vector<double>> myDoubles(3); 
myDoubles[2].resize(1000); 
myDoubles[2][999] = 10.55; 

也許你需要調整其他條目 - 我把這個練習留給你。

另外你不用擔心內存泄漏。