2014-09-19 3 views
1

В моем классе я получил:Доступ к динамическим 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. Просто нет, я не могу использовать его здесь.

+0

Um. вы намеревались 'mNumber [j] [k ++] == '\ 0'' в вашем while-loop условии вместо'! = ', потому что как только я вижу, что это произойдет с первым элементом. Во-вторых, 0xfdfdcdcd указывает, что вы получаете доступ к части граничной страницы и части освобожденной страницы, что означает, что вам лучше проверить * все * свою логику индекса. Кроме того, вы устанавливаете 'mNumber' в' setDefault() ', но используете' mUserNo' в 'write()'. У них разные имена. Либо это часть вашей проблемы, либо вам нужно отправить ** настоящий ** код. – WhozCraig

+0

Я действительно предлагаю использовать 'std :: vector' (или' char mNumber [5] [5] ', если вам действительно не разрешено использовать его). – Jarod42

ответ

0

Если вам нужно «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; 
} 
1

Вы только когда-либо устанавливаете mNumber в NULL, поэтому любой доступ к памяти через mNumber, mNumber [j] [k], например, скорее всего, приведет к сбою с нарушением прав доступа (1). Вам нужно инициализировать mNumber как содержательную ценность, используя new где-нибудь! А еще лучше, использовать стандартный контейнер, как std::vector:

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

(1) Это самая обычная вещь, чтобы случиться на Windows, и Linux, некоторые (но не много) операционки/системы могут молча позволить вам сделать это!

Смежные вопросы