2012-06-01 35 views
0

是否有人可以告诉我,如果有什么不正确使用这个初始化:C++初始化查询

static unsigned char* var[1] 
var[0] = new unsigned char[ 800 * 600 ] 

这是在创建无功[0]二维数组?这甚至有效吗?

+1

'var'的类型是什么? – betabandido

+1

是编译器给出的任何错误? – betabandido

+0

嗨betabandido,对不起。我现在编辑了我的帖子。那么,这只是我正在经历的一些旧代码,无法理解发生了什么。编译器不会给出任何错误。 – c0d3rz

回答

1

它在var [0]处创建一个长度为(800 * 600)的一维数组。您可以通过以下方式访问其中的元素:

var[0][0] 
var[0][1] 
... 
var[0][800*600-1] 
+0

谢谢埃里克,澄清,我很困惑... ... – c0d3rz

3

它创建一个包含480,000个元素(又名800 * 600)的单个数组并将其存储在var [0]中。它不创建2D数组。只要var[0]unsigned char*就是有效的。

+0

这是否意味着它覆盖了var [1],var [2]等? – c0d3rz

+0

否 - 如果'var [0]'是一个'unsigned char *',那么'var'必须是'unsigned char **'或者'std :: vector '或者其他类型的类型。分配给'var [0]'不会影响'var [1]'或var'的任何其他元素。 –

+0

由于'var'只有一个元素,因此'var [0]'是全部! –

1

您的代码不正确,因为 var[0]不再是指针。

您可能需要做这样的事情:

static unsigned char* var; 
var = new unsigned char[800 * 600]; 

不创建一个二维数组。它只是一个一维数组。话虽如此,如果您自己计算偏移量,则可以将它用作二维数组。例如访问位置(行,列),你可以这样做:

var[row * 600 + col] 

如果你真的想要一个“真正”的二维数组,你将需要使用例如:

static unsigned char** var; 
var = new unsigned char*[600]; 
for (int i = 0; i < 600; i++) 
    var[i] = new unsigned char[800]; 

当然,如果你不需要动态在运行时指定数组的大小,你可以只使用静态分配的数组:

static unsigned char var[600][800]; 

顺便说一句,我认为600(行数和800的cols的数量像在矩阵)。这就是为什么我总是在第一个索引中使用600。否则,只需交换值。

+1

'var [0]'类型为'unsigned char *'。 –

+0

@ K-ballo的OP改变了代码。之前它只是'unsigned char * var;' – betabandido

+0

或者你可以做'unsigned char var [600] [800];'并且为自己节省很多麻烦。 –

1

我想你想要更多的东西(尽管我可能会打断这个问题);

static unsigned char* var = new char*[800] 

for (int i =0; i < 800; i++) 
    var[i] = new char[600] 

这会给你一个800x600的2d字符数组。

+0

谢谢埃文... – c0d3rz

1

是的,使用new[]时相当不正确。你在找什么是std::vector<unsigned int> var(800 * 600);