下面的函数尝试对链表中的字符串按升序排序。当它返回新列表时,它就被破坏了。
void* order( void *ptr){
struct wordlist *head;
head = (struct wordlist *) ptr;
struct wordlist *first = (struct wordlist*)malloc(sizeof(struct wordlist));
struct wordlist *second = (struct wordlist*)malloc(sizeof(struct wordlist));
struct wordlist *temp = (struct wordlist*)malloc(sizeof(struct wordlist));
first = head;
int j = 1;
while( first != NULL){
second = first->next;
while( second != NULL){
if( strcmp( first->word, second->word) > 0){
if( temp->word == NULL){
temp->word = malloc( sizeof(first->word));
}
else{
if( realloc( temp->word, sizeof( first->word)) != NULL){
strcpy( temp->word, first->word);
}
}
if( realloc( first->word, sizeof(second->word)) != NULL){
strcpy( first->word, second->word);
}
if( realloc( second->word, sizeof(temp->word)) != NULL){
strcpy( second->word, temp->word);
}
free(temp);
}
second = second->next;
}
j++;
first = first->next;
}
}
例如,如果输入为
piero
ronaldo
messi
则输出看起来像
messi
ŽŽŽ
ronaldo
上面的例子没有在代码上试用,但它会给你一个提示。我相信内存的分配有问题,但我没能找到它。顺便说一下,有时候这些字也是空的。
同样,单词列表如下:
struct wordlist{
char *word;
struct wordlist *next;
};
不要第一次将字符串复制到临时文件中。
if( temp->word == NULL){
temp->word = malloc( sizeof(first->word));
// You forgot to copy!!
}
else{
if( realloc( temp->word, sizeof( first->word)) != NULL){
strcpy( temp->word, first->word);
}
}
看,如果temp->word
是NULL
,它第一次应该是(注意,你实际上没有清除temp
结构体,所以你已经得到未定义的行为),那么你不复制它。快速解决方法是在malloc
之后做strcpy
。
你的realloc
呼叫都是错误的。不能使用sizeof
来获取字符串的大小。使用strlen
,不要忘记为字符串结束符添加一个额外的字节。
此外,您不应该分配first
和second
。它们是数据结构的迭代器。您要做的第一件事是丢弃它们的值,这样就会泄漏内存。别忘了free
你的temp
结构以及temp->word
之后。
在你让它工作之后,请停止所有malloc
和strcpy
的业务!!
移动字符串只需要移动指针。不需要重新分配或复制。这将把你的代码简化到几行。
哦,你还忘记从你的函数中return
一个值吗?