C++ 访问动态2D字符数组C++;

C++ 访问动态2D字符数组C++;,c++,arrays,dynamic,multidimensional-array,C++,Arrays,Dynamic,Multidimensional Array,在我的课堂上,我有: private: //... char** mNumber; //... 然后我在构造函数中初始化它: PhoneBook::PhoneBook() { mNumber = NULL; } 我还将方法设置为默认值: bool PhoneBook::setDefault() { lock(); //... for (uint8 i = 0; i < 5; ++i) { mNumber[

在我的课堂上,我有:

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;
}
它也不会设置默认值(它们不会显示在应用程序窗口中它们应该显示的位置)。
Visual Studio 2010提示:

Unhandled exception at 0x012b6fb8 (main_app.exe) in main_app: 0xC0000005: Access violation reading location 0xfdfdcdcd.
我试过调试它,但找不到出什么问题。我只能猜测2d数组有什么问题,因为我对它们感觉不太好,当我尝试过类似于1D的东西时,效果很好。
请帮助我学习代码,让我们更好地理解C++中的多数组。
顺便说一句,我不允许使用std::string。只是不,我不能在这里使用它。

您只将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!
//mNumber的声明,不要将mNumber初始化为NULL!
std::vector mNumber;//这里只需要一个!
(1) 这是在Windows和Linux上发生的最常见的事情,一些(但不是很多)操作系统/系统可能会默默地让您这样做

如果需要“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;
}
bool电话簿::setDefault()
{
........
mNumber=新字符*[5];//为mNumber分配内存
对于(uint8 i=0;i<5;++i)
{
mNumber[i]=新字符[4];
对于(uint8 k=0;k<4;++k)
{
mNumber[i][k]=“0”+k;
}
mNumber[i][4]='\0';
}
解锁();
返回true;
}

Um。您是否打算将while循环条件中的
mNumber[j][k++]='\0'
设置为
=相反,因为在我看来,这将在第一个元素上失败。其次,0xfdcdcd表示您正在访问边界页的一部分和已释放页的一部分,这意味着您最好检查所有索引逻辑。另外,您可以在
setDefault()
中设置
mNumber
,但在
write()
中使用
mUserNo
。他们是不同的名字。这是你的问题的一部分,或者你需要发布真实的代码。我真的建议使用
std::vector
(或者
charmnumber[5][5]
,如果你真的不允许使用它)。
// the declaration of mNumber, do not initialise mNumber to NULL!
std::vector <char *> mNumber; // only need one * here!
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;
}