我有一个函数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;
}
答案 0 :(得分:0)
标记指向原始字符串内存块内的内存位置。当释放原始字符串时,标记将指向垃圾。如果您想要保留令牌,则必须不要释放原始字符串或创建每个令牌的副本(即使用strcpy
或strdup
- 请参阅下面的评论。)
导致您发出问题的行是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
,你的程序会崩溃。