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在行中遇到错误b[i][j] = 0;

我在哪里做错了?

4

6 回答 6

2

您的代码在 中分配内存b,但这不是您稍后尝试设置的。相反,您尝试设置b未分配的。

于 2012-11-10T23:09:20.637 回答
2

由于bhas 类型int**,表达式b[i]指向偏移量sizeof(int*)*i(b[i])[j]添加偏移量sizeof(int)*j。总的来说,您访问的偏移量字节与用于确定平面一维数组中索引sizeof(int*)*i + sizeof(int)*j的偏移量完全不同。sizeof(int)*(i*j)

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

于 2012-11-10T23:19:43.747 回答
1

真正的问题是,如果你使用b作为二维数组而不指定一维,编译器并不真正知道如何索引它的访问,试着这样写:

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

我们在这里所做的是将b声明为指向 12 元素数组的指针,因此当我们对i索引进行索引时,编译器知道它必须乘以 12。

于 2012-11-10T23:15:20.727 回答
1

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

于 2012-11-10T23:09:38.393 回答
0

问题是[i][j]手段i*row_length+jrow_length但是在这个例子中没有定义。您应该更改访问单个元素的方式,或者在堆栈上创建一个数组。

于 2012-11-10T23:18:57.377 回答
0

摆脱演员表,然后弄清楚你想要分配什么类型以及将它存储在什么类型的变量中。演员表隐藏了一个错误。

于 2012-11-10T23:12:06.940 回答