2012-05-28 55 views
0

我是C++中的新手,我嘗試創建一個對象數組。我使用的代碼如с++訪問違反對象數組

const int SORT_SIZE = 20; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    CSimple * data; 
    data = new CSimple[SORT_SIZE]; 

    for(int i = 0; i < SORT_SIZE; i++) 
    { 
/*Access violation here*/ *(data + i * (sizeof(CSimple))) = *(new CSimple(rand() % 10000)); 
    } 

並在我的循環中我= 5我得到訪問衝突。 sizeof(CSimple)是8(只有一個int字段)如果它很重要

+0

對不起,刪除我的答案 - 在重新讀取您的代碼後,我所說的只是刪除更好。 – djechlin

+1

取出'*(sizeof(CSimple)' –

+0

@PaulR是對的,編譯器負責按指針對象的大小縮放指針算術運算的整數操作數,所以當你這樣做的時候, – tmpearce

回答

1

將for循環中的行替換爲data[i] = CSimple(rand() % 10000)。更多readabale,不是嗎?

您的代碼失敗的原因是因爲data + i不會通過i字節遞增數據,而是通過i CSimple's遞增數據。比方說,如果CSimple的長度是4個字節,那麼data + i * sizeof(CSimple)會將數據增加16個字節而不是4個。

+0

'&data [i]',不是?編輯:不,內存已經aloc'ed,所以刪除'新'。 – djechlin

+0

@djechlin編輯:看來我們都不正確(並同時糾正自己)。 – AardvarkSoup

+0

你對,TY! –

-2

作爲一個新手,爲什麼不讓自己的生活變得更簡單,並使用自動完成工作的類型?

#include <vector> 

const int SORT_SIZE = 20; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::vector<CSimple> data; 

    for(int i = 0; i < SORT_SIZE; i++) 
    { 
     data.push_back(CSimple(rand() % 10000)); 
    }