什么导致以下程序中的运行时错误?

时间:2015-06-24 08:55:50

标签: c++

我正在使用这个简单的函数来创建一个新节点

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;

5 个答案:

答案 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);