在我的班上,我得到了:
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 ++中的multiD数组
顺便说一下,我不允许使用std :: string。不,我不能在这里使用它。
答案 0 :(得分:1)
您只需将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上最常见的事情,有些(但不是很多)操作系统/系统可能会默默地让你这样做!
答案 1 :(得分:0)
如果你需要&#34; char **&#34;而不是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;
}