В моем классе я получил:Доступ к динамическим 2D массив символов C++
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, он работал нормально.
Пожалуйста, помогите мне с кодом и дайте лучше понять массивы multiD в C++.
BTW Я не могу использовать std :: string. Просто нет, я не могу использовать его здесь.
Um. вы намеревались 'mNumber [j] [k ++] == '\ 0'' в вашем while-loop условии вместо'! = ', потому что как только я вижу, что это произойдет с первым элементом. Во-вторых, 0xfdfdcdcd указывает, что вы получаете доступ к части граничной страницы и части освобожденной страницы, что означает, что вам лучше проверить * все * свою логику индекса. Кроме того, вы устанавливаете 'mNumber' в' setDefault() ', но используете' mUserNo' в 'write()'. У них разные имена. Либо это часть вашей проблемы, либо вам нужно отправить ** настоящий ** код. – WhozCraig
Я действительно предлагаю использовать 'std :: vector' (или' char mNumber [5] [5] ', если вам действительно не разрешено использовать его). – Jarod42