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

不要第一次将字符串复制到临时文件中。

            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一个值吗?

相关内容

  • 没有找到相关文章

最新更新