【问题标题】:Characters duplicate in a multidimensional array多维数组中重复的字符
【发布时间】:2019-03-24 11:19:23
【问题描述】:

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

【问题讨论】:

  • 与您的问题无关,但这是一个写得很好的第一个问题。您为我们提供了一个最小可验证的完整示例,以及您的期望与实际输出。我期待在这里看到您的更多贡献!
  • initialize 的 C++ 习惯用法是多维、固定大小的数组 char arr[2][2] = { };。另一种选择是std::fill

标签: c++


【解决方案1】:

当您声明 char arr[2][2] = { 0 }; 时,这是一个 2x2 数组。这意味着它的索引从 0 变为 1。您正在写入索引 2,它超出了数组范围。

【讨论】:

  • 不可能,是的。
【解决方案2】:

可能发生了一些内存攻击。 当您将数组声明为 char arr[2][2] = { 0 }; 数组时,两个数组的大小为 char 的两个数组。这意味着 4 个字符元素。

您可以访问它们

arr[0][0];
arr[0][1];
arr[1][0];
arr[1][1];

要使您的代码正常工作,您需要将数组的大小增加到char arr[3][3] = { 0 };

回答您的问题,为什么它们会重复。 当您分配 char arr[2][2] 时,内存继续,它将为 4 个元素分配空间,它可能与 char arr[4] 相同。
当您尝试访问超出数组边界的元素时,行为未定义,导致访问第二个数组的内存。

【讨论】:

    【解决方案3】:

    那是因为你要通过你的数组。 char arr[2] 的数组仅从 0 变为 1(即 2 个值)。同样,对于您的arr[2][2],您也只能使用01 作为数组索引。

    试试这个:

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

    现在数组索引可以从0 变为2

    【讨论】:

      猜你喜欢
      • 2018-03-05
      • 2013-05-08
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多