2015-01-16 4 views
0

Я пытаюсь получить доступ к члену структуры «Word» через другую структуру «Dict», используя двойной указатель **, но получая ошибку «нарушение доступа» в visual studio 2010. I проверил ссылку «accessing double pointer to structure» также на stackoverflow, но также не разрешил проблему. Может кто-нибудь, пожалуйста, помогите мне определить ошибку в коде? Я вставляю код здесь:переменная с двумя указателями, допускающая ошибку нарушения доступа в C++ struct program

======================================================================================================================== =====

#include <iostream> 
#include <stdlib.h> 
#include <time.h> 
//#include "dict.h" 
using namespace std; 

enum WordType{All, Animal, Fruit, Name}; 

struct Word{ 
    WordType type; 
    char word[20]; 
}; 

struct Dict{ 
    int size; 
    int capacity; 
    Word **wordArray; 
}; 

int main() { 

    Dict *dic = new Dict;; 
    dic->size=0; 
    dic->capacity=0; 

    strcpy((dic->wordArray[0])->word,"hi"); 

    cout<< (dic->wordArray[0])->word; 
    system("pause"); 
    return 0; 
} 

====================================== ==================

+4

Вы не сделали 'wordArray' точки к чему-либо. Но отбросьте понтеров и используйте 'std :: vectors'. – juanchopanza

+2

Подсказка: что такое значение 'dic-> wordArray'? –

+1

[Указатель не является массивом] (http://stackoverflow.com/questions/1641957) –

ответ

0

Может быть, вы должны отказаться от двойного указателя и сделать что-то вроде:

struct Word{ 
    WordType type; 
    char word[20]; 
    Word* next; 
}; 


struct Dict{ 
    int size; 
    int capacity; 
    Word *word; 
}; 

и главный:

dic->word = new Word; 
dic->word.next = nullptr; 

strcpy(dic->word->word,"hi"); 

, а затем сделать слово связанным списком, используя следующие указатели.

EDIT: Вышеупомянутое решение не может использоваться, поскольку исходные структуры не изменяются.

Может быть, попробовать что-то вроде:

Dict *dic = new Dict;; 
dic->size=0; 
dic->capacity=MAX_NUMBER_OF_WORDS; 
dic->wordArray=new Word *[dic->capacity]; 

и при вставке новых слов:

dic->wordArray[dic->size] = new Word; 
dic->size++; 

И добавить проверку на емкости в зависимости от размера, чтобы избежать переполнения.

BTW: Не забудьте использовать удаление и все, что создано новым.

+0

Nielsen. спасибо за комментарий. Это, безусловно, будет работать, но моему назначению нужно использовать только двойной указатель, и у меня нет другого выбора. –

+0

@Kumar: Значит, вам не разрешено менять ни одну из структур? – 4386427

+0

Или вы можете использовать идиомы C++. –

0

Глядя на ваш код, я не вижу причин, почему Word в struct Dict должен быть двойной стрелкой.

Но я вижу очень хорошую причину, почему char внутри struct Word должен быть двойным указателем - это «массив слов» или двумерная матрица char.

Поэтому я предлагаю эту модификацию, которая работает ...

#include <iostream> 
    #include <vector> 
    #include <complex> 

    #include <iostream> 
    #include <stdlib.h> 
    #include <time.h> 
    //#include "dict.h" 
    using namespace std; 

    enum WordType{ All, Animal, Fruit, Name }; 

    struct Word{ 
     WordType type; 
     char** word; 
    }; 

    struct Dict{ 
     int size; 
     int capacity; 
     Word wordArray; 
    }; 

    int main() { 

     Dict *dic = new Dict; 
     dic->size = 0; 
     dic->capacity = 0; 
     dic->wordArray.word = new char*[4]; // make an array of pointer to char size 4 
     for (int i = 0; i < 10; i++) { 
      dic->wordArray.word[i] = new char[5]; // for each place of above array, make an array of char size 5 
     } 

     strcpy_s(dic->wordArray.word[0], strlen("hi") + 1, "hi"); 
     strcpy_s(dic->wordArray.word[1], strlen("John") + 1, "John"); 
     strcpy_s(dic->wordArray.word[2], strlen("and") + 1, "and"); 
     strcpy_s(dic->wordArray.word[3], strlen("Mary") + 1, "Mary"); 

     cout << dic->wordArray.word[0] << endl; 
     cout << dic->wordArray.word[1] << endl; 
     cout << dic->wordArray.word[2] << endl; 
     cout << dic->wordArray.word[3] << endl; 

     system("pause"); 
     return 0; 
    }