#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
это atypedef
, и это вопрос C. Суть в том, что вам ни при каких обстоятельствах не следуетmalloc
хранитьstd::string
, если вы уже не являетесь экспертом в C и вам не нужно задавать этот вопрос.malloc
ingstring
s требует специальной обработки (search keyterm: размещениеnew
), посколькуmalloc
предоставляет только хранилище. Он не вызывает конструкторы, а неструктурированный — это бомбаstring
замедленного действия..3. Исправлено @AndreasWenzel
4. @user4581301 скорректировался, чтобы быть просто вопросом c
5.Оказывается
vector
, это не нужно.struct Node *temp = (Node*)malloc(sizeof(Node));
не знает, как сконструировать 99string
s вword
элементеNode
(см. Комментарий выше). Вы можете решить эту проблемуstruct Node *temp = new Node;
new
, выделив хранилище для, а затем создав aNode
.
Ответ №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
. Смешивание динамического выделения памяти из разных механизмов создает потенциальные проблемы.