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;
我在哪里做错了?
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;
我在哪里做错了?
您的代码在 中分配内存b
,但这不是您稍后尝试设置的。相反,您尝试设置b
未分配的。
由于b
has 类型int**
,表达式b[i]
指向偏移量sizeof(int*)*i
并(b[i])[j]
添加偏移量sizeof(int)*j
。总的来说,您访问的偏移量字节与用于确定平面一维数组中索引sizeof(int*)*i + sizeof(int)*j
的偏移量完全不同。sizeof(int)*(i*j)
您正在请求一维数组,但将其视为二维数组。那是行不通的。像往常一样,铸造是罪魁祸首。
真正的问题是,如果你使用b作为二维数组而不指定一维,编译器并不真正知道如何索引它的访问,试着这样写:
int (* b)[12];
b = new int[5][12];
我们在这里所做的是将b声明为指向 12 元素数组的指针,因此当我们对i索引进行索引时,编译器知道它必须乘以 12。
b
未初始化,因此通过它访问会产生未定义的行为。
问题是[i][j]
手段i*row_length+j
。row_length
但是在这个例子中没有定义。您应该更改访问单个元素的方式,或者在堆栈上创建一个数组。
摆脱演员表,然后弄清楚你想要分配什么类型以及将它存储在什么类型的变量中。演员表隐藏了一个错误。