Ошибка сегментации при доступе к строковому массиву структуры

#c #string

#c #строка

Вопрос:

В настоящее время я сталкиваюсь с проблемой, когда мне приходится вводить слова (строки) в двоичное дерево поиска, и я делаю это, помещая слова (строки) в строковые массивы, однако, когда я пытаюсь поместить его в первый элемент, это ошибка сегментации.

Вот что у меня есть:

node.h

 typedef struct Node{
    char letter;
    int asiccValue;
    struct Node *left, *right;
    string words[99];
    int wordCount;
}Node;
  

tree.cpp

 // This function creates new nodes as needed
Node *createNode(string word){
    // Assigns values
    struct Node *temp = (Node*)malloc(sizeof(Node));
    temp->letter = word[0];
    temp->asiccValue = (int)word[0];
    temp->left = NULL;
    temp->right = NULL;
    temp->words[0] = word;
    temp->wordCount = 1;
    return temp;
}
  

Комментарии:

1. @TomKarzes Я это исправил, но получаю ту же ошибку.

2. если string это на самом деле std::string , и этот вопрос относится к языку программирования C , ответ будет радикально отличаться от того, что будет, если string это a typedef , и это вопрос C. Суть в том, что вам ни при каких обстоятельствах не следует malloc хранить std::string , если вы уже не являетесь экспертом в C и вам не нужно задавать этот вопрос. malloc ing string s требует специальной обработки (search keyterm: размещение new ), поскольку malloc предоставляет только хранилище. Он не вызывает конструкторы, а неструктурированный — это бомба string замедленного действия..

3. Исправлено @AndreasWenzel

4. @user4581301 скорректировался, чтобы быть просто вопросом c

5.Оказывается vector , это не нужно. struct Node *temp = (Node*)malloc(sizeof(Node)); не знает, как сконструировать 99 string s в word элементе Node (см. Комментарий выше). Вы можете решить эту проблему struct Node *temp = new Node; new , выделив хранилище для, а затем создав a Node .

Ответ №1:

malloc не вызывает конструкторы, что означает, что ваш string массив не инициализирован. Для любого нетривиального типа вы действительно хотите избежать malloc , если не знаете, что делаете (см. Также: размещение new ).

Использование new должно решить вашу проблему. Убедитесь, что вы обновили существующий код, чтобы использовать delete вместо free . Кроме того, подумайте о том, чтобы полностью избавиться от new / delete и использовать make_unique and friends .

 Node *createNode(string word){
    // Assigns values
    Node * temp = new Node;
    temp->letter = word[0];
    temp->asiccValue = (int)word[0];
    temp->left = NULL;
    temp->right = NULL;
    temp->words[0] = word;
    temp->wordCount = 1;
    return temp;
}
  

Комментарии:

1. При использовании C вам следует избегать malloc, поскольку память выделяется в потенциально иной области, чем используемая программами на C , которые обычно используются new . Смешивание динамического выделения памяти из разных механизмов создает потенциальные проблемы.