字符在多维数组中重复

时间:2018-10-19 14:31:31

标签: c++

我创建了一个空的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 }初始化数组,但没有帮助。

3 个答案:

答案 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]数组仅从01(这是2个值)。同样,对于您的arr[2][2],您也只能使用01作为数组索引。

尝试以下方法:

char arr[3][3] = { 0 };

现在,数组索引可以从02