我正在使用这个简单的函数来创建一个新节点
node* Tree::createNewNode(int score, const char* word)
{
// Create a new node with the information available
node* n = new node;
n->left=NULL;
n->right = NULL;
n->parent = NULL;
n->score = score;
strcpy(n->word,word);
return n;
}
节点是一个结构:
struct node
{
int score; // the score or label of the node
char *word; // the word stored in the node
node *left; // the pointer to left child of the node
node *right; // the pointer to right child of the node
node *parent; // the pointer to parent node
};
我从另一个函数
调用createNewNode函数temp = t->createNewNode(score,"");
该函数只运行一次,然后在执行时崩溃:
node* n = new node;
答案 0 :(得分:1)
您需要为word
字段分配内存。您正试图将数据复制到word
而不为其分配空间。
将char *word
更改为char word[100];
答案 1 :(得分:1)
char *word; // this is a pointer to string, aka this is not a string
char word[100]; // this is a string
n->word
未初始化。当您使用strcpy
时,您正在将word
内容复制到未知地址。
这个未知行为的结果(第一个调用看起来像是工作,第二个调用使程序崩溃)。您需要分配内存空间以在结构中保存word
字符串。
答案 2 :(得分:1)
您的错误是由于word
未分配内存造成的。
你可以使用遗留的C功能来解决这个问题,就像在其他答案中一样,或者你实际上可以编写idomatic C ++。
createNewNode
函数中完成的所有初始化都应该在node
构造函数中完成。您应该使用std::string
而不是char*
来避免您目前拥有的内存分配失败。您还应该保护node
类的成员,而不是让变更器将它们从树中附加/分离,这样您就不需要手动执行。
答案 3 :(得分:0)
您的程序在以下行中崩溃,
strcpy(n->word,word);
因为n->word
struct node
char *word; // the word stored in the node
没有分配任何记忆。
使用char array
代替char pointer
或更改功能定义,如下所示:
node* createNewNode(int score, const char* word, int wordLen)
{ ^^^^
// Create a new node with the information available
node* n = new node;
n->left=NULL;
n->right = NULL;
n->parent = NULL;
n->score = score;
n->word = (char *) malloc(wordLen);
strcpy(n->word,word);
return n;
}
答案 4 :(得分:0)
strcpy(n->word, word)
将输入字符串复制到尚未初始化的n->word
中。要使该工作能够正常工作,n->word
必须指向已分配的缓冲区。
strdup
函数为您分配缓冲区并将输入字符串复制到该缓冲区中,例如:
n->word = strdup(word);