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;
错误
我在哪里做错了?
答案 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
。您应该更改如何访问单个元素,或者在堆栈上创建一个数组。