2012-11-10 212 views
0
int ** b; 

b = (int **)(new int[5 * 12]); 

for (int i = 0; i < 5; i++) { 
    for (int j = 0; j < 12; j++) { 
     b[i][j] = 0; 
    } 
} 

我得到access violation错误的行两个dimensinal阵列b[i][j] = 0;C++填充零的

我在哪里做错了?

+0

同样的问题:代码定义了'int ** b',将一个值存储到'this-> b'中,并访问在顶部定义的'b'。 –

+0

啊,好的。我的错。再次纠正。 – totten

+1

问题是[i] [j]意味着我* row_length + j。但是在这个例子中没有定义row_length。你应该改变如何访问单个元素,或者在堆栈上创建一个数组。 –

回答

2

b由于具有类型int**,表达b[i]点到偏移sizeof(int*)*i(b[i])[j]加上偏移sizeof(int)*j。您总共访问的是偏移量为sizeof(int*)*i + sizeof(int)*j的字节,与偏移量sizeof(int)*(i*j)的偏移量完全不同,该偏移量将用于确定平面一维数组中的索引。

您正在请求一维数组,但将其视为二维数组。这是行不通的。像往常一样,铸造是怪罪。

2

您的代码会分配b中的内存,但这不是您以后尝试设置的内存。而是尝试设置未分配的b

1

b未初始化,因此通过它进行访问会产生未定义的行为。

0

摆脱演员,然后找出你想分配什么类型和什么类型的变量来存储它。剧组隐藏了一个错误。

1

真正的问题是,如果你使用b作为一个二维数组,而不指定一个维度,编译器不真正懂得它的索引访问,尝试写这样的:

int (* b)[12]; 
b = new int[5][12]; 

我们在这里做什么是声明b作为指针以一个12元件阵列,所以,当我们在索引i索引,编译器知道它必须由12

+0

我无法更改int **,所以我用我现在发布的答案解决了我的问题。 – totten

0

相乘问题[i][j]装置i*row_length+j。但在本例中没有定义row_length。你应该改变如何访问单个元素,或者在堆栈上创建一个数组。