2012-05-28 22 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)); 
    }