2013-03-27 61 views
0

下面的函数尝试按升序对链表上的字符串进行排序。当它返回新的列表时,它将被损坏。strcpy损坏字符数组(字符串值)

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; 
}; 
+1

要订购链接列表,您不需要执行所有这些内存分配,只要您想要移动某些东西,您应该只需更改一些“下一个”指针即可。在相关说明中,您将内存分配给'second',然后您立即使用'second = first-> next;' – lxop 2013-03-27 02:21:52

+1

您意识到您可以交换指针,对吗?你不必'realloc'和'strcpy'来移动它们。 – paddy 2013-03-27 02:23:39

回答

1

你不围绕复制字符串到您的临时的第一次。

  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->wordNULL,它应该是在第一时间(注意,你实际上并不明确temp结构已经这样你会得到未定义的行为),那你就不要复制它。快速解决办法是在malloc之后执行strcpy。您的realloc电话都是错误的。您不能使用sizeof来获取字符串的大小。为此,请使用strlen,并且不要忘记为字符串终止符添加一个额外的字节。

此外,您不应该分配firstsecond。它们是您数据结构的迭代器。你做的第一件事就是放弃它们的价值,以便泄漏记忆。之后请不要忘记free您的temp结构以及temp->word

当你得到那个工作后,请停止所有这mallocstrcpy业务!

要移动你周围的字符串,只需要移动指针。不需要重新分配或复制。这将简化您的代码到少数几行。

哦,你还忘了return从你的函数值?

+0

我刚刚删除了“if strcmp {}”部分中的所有内容,并在三行中进行了指针交换。它像一个魅力。我浪费了几个小时来解决这个问题,但它非常简单。谢谢。 – gzg 2013-03-27 02:35:01

+1

没问题。它没有被浪费 - 希望你从经验中学到很多东西=) – paddy 2013-03-27 02:37:09