C ++用零填充二维数组

时间:2012-11-10 23:05:33

标签: c++

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;错误

我在哪里做错了?

6 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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 :(得分:1)

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

答案 3 :(得分:1)

真正的问题是如果你使用 b 作为二维数组而没有指定一个维度,编译器实际上并不知道如何索引它的访问权限,尝试这样写:

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

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

答案 4 :(得分:0)

摆脱演员表,然后找出你想要分配的类型以及存储它的变量类型。演员隐藏了一个错误。

答案 5 :(得分:0)

问题是[i][j]表示i*row_length+j。但是此示例中没有定义row_length。您应该更改如何访问单个元素,或者在堆栈上创建一个数组。