初始化函数在C结束后保持strok令牌

时间:2017-10-26 03:57:58

标签: c instance-variables strtok

我有一个函数foo(),它使用strtok()来标记字符串并将令牌发送到费用(char * new_word),我需要将其分配给新节点。现在这一切都很好,但是当foo()和fee()结束时,我需要运行打印链表的bar(),并且我可以告诉节点指针中的数据被破坏了我不能使用它。我怎样才能抓住代币?

struct node{
 char *word;
 struct node *next;
};

struct node top = NULL;

void foo(){
 char *str = "Some words go here";
 char *token = NULL;
 token = strtok(str, "\n");
 while (token){
    fee(token);
    token = strtok(NULL, "\n");
 }
}

void fee(char * new_word){
 struct node *new_node = malloc(sizeof(struct node));
 new_node->word = new_word;
 new_node->next = head;
 head = new_node;
}

bar(){
  while (top){
     printf("%s\n", top->word);
     top = top->next;
  }
}
int main( int argc, char *argv[] ){
foo();
bar();
return 0;
}

1 个答案:

答案 0 :(得分:0)

标记指向原始字符串内存块内的内存位置。当释放原始字符串时,标记将指向垃圾。如果您想要保留令牌,则必须不要释放原始字符串或创建每个令牌的副本(即使用strcpystrdup - 请参阅下面的评论。)

导致您发出问题的行是new_node->word = new_word;中的fee()。而是分配令牌指针,您需要为new_node->word分配内存并将new_word复制到其中。执行foo时,将释放字符串内存块。到bar执行时,您的令牌指向未分配的内存。

或者,如果您在char *str = "Some words go here";上方main初始化foo(),然后传递str(即foo(str)),那么自{{ {1}}将保留在范围内。如果你走这条路,不要试图释放str,你的程序会崩溃。