我创建了一个空的char
多维数组,但是当我尝试更改特定值时,有时会复制到数组中的另一个空间。
示例:
#include <iostream>
using namespace std;
char arr[2][2] = { 0 };
int main ()
{
arr[2][0] = 'A';
for(int i = 0; i < 3; ++i)
{
for(int j = 0; j < 3; ++j)
{
cout << "arr[" << i << "][" << j << "] = " << arr[i][j] << endl;
}
}
}
输出:
arr[0][0] =
arr[0][1] =
arr[0][2] =
arr[1][0] =
arr[1][1] =
arr[1][2] = A
arr[2][0] = A
arr[2][1] =
arr[2][2] =
字符A
仅应出现在[2][0]
中,但也应出现在[1][2]
中。
这仅在以下空间发生:
[1][0], [2][0], [0][2], [2][2]
我能够使用更大的数组来重新创建它,但是我不能说具体的值。
我尝试在main()
函数内部进行定义,但是这又带来了另一个问题,随机字符开始出现在数组的随机位置。
我尝试使用char arr[2][2] = { 0 }
初始化数组,但没有帮助。
答案 0 :(得分:6)
声明char arr[2][2] = { 0 };
时,这是一个2x2数组。这意味着它的索引从0到1。您正在写入索引2,它在数组范围之外。
答案 1 :(得分:2)
可能发生了一些内存重击。
当您将一个数组声明为char class A {
methodA() {
console.log('method of A');
}
doesMethodBelongHere(method) {
let proto = this;
// iterate the prototypes chain
while (proto = Object.getPrototypeOf(proto), proto && proto !== Object) {
// iterate the prototype properties, and if one them is equal to the method's reference, return true
for (const m of Object.getOwnPropertyNames(proto)) {
const prop = proto[m];
if (typeof(prop) === 'function' && prop === method) return true;
}
}
return false;
}
}
class B extends A {}
class C extends B {}
const c = new C();
Object.assign(c, {
anotherMethod() {}
});
c.anotherMethod2 = () => {};
console.log(c.doesMethodBelongHere(c.methodA)); // should return true
console.log(c.doesMethodBelongHere(c.anotherMethod)); // should return false
console.log(c.doesMethodBelongHere(c.anotherMethod2)); // should return false
数组时,两个数组的大小为char的两个。表示4个char元素。
您可以通过以下方式访问它们
arr[2][2] = { 0 };
要使代码正常工作,您需要将数组的大小设置为arr[0][0];
arr[0][1];
arr[1][0];
arr[1][1];
要回答您的问题,为什么要重复。
当您分配char arr[3][3] = { 0 };
时,内存将继续,它将为4个元素分配空间,并且可能与char arr[2][2]
相同。
当您尝试访问数组边界之外的元素时,行为未定义,这导致访问第二个数组的内存。
答案 2 :(得分:0)
那是因为您要经过数组。 char arr[2]
数组仅从0
到1
(这是2个值)。同样,对于您的arr[2][2]
,您也只能使用0
和1
作为数组索引。
尝试以下方法:
char arr[3][3] = { 0 };
现在,数组索引可以从0
到2
。