【问题标题】:Accessing dynamic 2D char array C++访问动态二维字符数组 C++
【发布时间】:2014-11-13 17:47:29
【问题描述】:

在我的课堂上我有:

private:
    //...
    char** mNumber;
//...

然后我在构造函数中初始化它:

PhoneBook::PhoneBook()
{   
    mNumber = NULL;

}

我也设置了默认方法:

bool PhoneBook::setDefault()
{
    lock();
    //...

    for (uint8 i = 0; i < 5; ++i)
    {
        mNumber[i] = new char[5];
        for (uint8 k = 0; k < 4; ++k)
        {
            mNumber[i][k] = '0' + k;
        }
        mNumber[i][4] = '\0';
    }
    unlock();
    return true;
}

在我的程序中,当我想写数字时(最多可以写五个数字),程序应该使用方法:

    bool PhoneBook::write(DataOutputStream& s)

{
    lock();
    //...
    unsigned long checksum = 0;

    for (uint8 j = 0; j <5; j++)
    {
        unsigned short k = 0;
        do
        {
        char number= mUserNo[j][k];
        checksum += 0x000000FF & (number>> 8); //checksum is not problem here I guess
        checksum += 0x000000FF & (number);
        s.write_int8(userNo);
        } while(mNumber[j][k++]=='\0');
    }

    s.write_uint32(checksum);
    s.flush();
    unlock();
    return (s.ok());
}

它在行崩溃:

char userNo = mUserNo[j][k];

它也没有设置默认值(它们不会显示在它们应该在的应用程序窗口中)。
Visual Studio 2010 提示:

Unhandled exception at 0x012b6fb8 (main_app.exe) in main_app: 0xC0000005: Access violation reading location 0xfdfdcdcd.

我尝试调试它,但无法找出问题所在。我只能猜测 2d 数组有问题,因为我对它们感觉不太好,当我尝试与 1D 类似的东西时,它工作得很好。
请帮我写代码,让我更好地理解 C++ 中的多维数组。
顺便说一句,我不允许使用 std::string。不行,我这里不能用。

【问题讨论】:

  • 嗯。您是否打算将您的while循环条件中的mNumber[j][k++]=='\0'改为!=,因为据我所知,这将在第一个元素上失败。其次, 0xfdfdcdcd 表示您正在访问边界页面的一部分和已释放页面的一部分,这意味着您最好检查 all 您的索引逻辑。此外,您在setDefault() 中设置mNumber,但在write() 中使用mUserNo。他们是不同的名字。这可能是您的问题的一部分,或者您需要发布真实代码。
  • 我真的建议使用std::vector(或者char mNumber[5][5],如果你真的不允许使用它)。

标签: c++ arrays dynamic multidimensional-array


【解决方案1】:

如果你需要 "char**" 而不是 std::vector,你应该在填充默认值之前为其分配内存。像这样,

bool PhoneBook::setDefault()
{
........
mNumber = new char*[5];           // allocating memory for mNumber
for (uint8 i = 0; i < 5; ++i)
{
    mNumber[i] = new char[4];
    for (uint8 k = 0; k < 4; ++k)
    {
        mNumber[i][k] = '0' + k;
    }
    mNumber[i][4] = '\0';
}
unlock();
return true;
}

【讨论】:

    【解决方案2】:

    您只将 mNumber 设置为 NULL,因此通过 mNumber 访问内存,例如 mNumber [j][k],很可能会因访问冲突 (1) 而崩溃。您需要通过在某处使用 new 将 mNumber 初始化为一个有意义的值!更好的是,使用像 std::vector 这样的标准容器:

    // the declaration of mNumber, do not initialise mNumber to NULL!
    std::vector <char *> mNumber; // only need one * here!
    

    (1) 这是在 Windows 和 Linux 上最常发生的事情,一些(但不是很多)操作系统/系统可能会默默地让您这样做!

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2021-10-08
      • 2017-04-13
      • 1970-01-01
      • 2014-05-02
      • 2018-05-17
      • 2017-03-11
      • 1970-01-01
      相关资源
      最近更新 更多