You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中将链表所有字符串转为大写?段错误排查求助

链表字符串转大写函数的段错误排查与修复

你这段代码触发段错误主要有几个核心问题,咱们一步步拆解分析:

1. 直接修改只读内存的字符串

你在循环里直接修改了ptr->w指向的字符:

word[i] = toupper((unsigned char)word[i]);

如果原链表的w字段指向的是字符串字面量(比如代码里直接写的"test"这类字符串),这些内容是存储在只读内存段的,强行修改会直接触发段错误。咱们得先复制一份字符串到可写内存,再对副本做转大写操作,不能动原字符串。

2. 错误的链表节点添加目标

你调用add_end(indexWords, new_word(word, 0))时,把新节点加到了**原链表indexWords**上,而不是你要创建的新链表upperIndexWords。这会导致原链表被意外篡改,新链表根本没正确构建,后续访问极容易出现野指针或链表循环,进而引发段错误。

3. 未独立存储转大写后的字符串

就算原字符串可修改,直接把原word指针传给new_word,会导致新链表节点和原链表共享同一块内存——后续如果原链表释放内存,新链表就会出现悬空指针。正确做法是生成转大写后的独立字符串,再传给new_word。

修复后的代码

wordnode_t *upperAll(wordnode_t *indexWords) { 
    wordnode_t *upperIndexWords = NULL; 
    wordnode_t *ptr = indexWords; 
    while (ptr) { 
        // 复制原字符串到新的可写内存,避免修改原数据或只读内存
        size_t len = strlen(ptr->w) + 1;
        char *upperWord = malloc(len);
        if (!upperWord) {
            // 内存分配失败的处理逻辑,可根据需求补充报错或清理操作
            perror("malloc failed");
            // 可选:若分配失败,清理已创建的新链表避免内存泄漏
            // free_upper_list(upperIndexWords);
            return NULL;
        }
        strcpy(upperWord, ptr->w);
        
        // 对副本执行转大写操作
        for (size_t i = 0; upperWord[i]; i++) { 
            upperWord[i] = toupper((unsigned char)upperWord[i]); 
        } 
        
        // 将新节点添加到目标新链表的末尾
        upperIndexWords = add_end(upperIndexWords, new_word(upperWord, 0)); 
        ptr = ptr->next; 
    } 
    return upperIndexWords; 
}

额外注意点

  • 确认new_word函数的实现逻辑:如果它会自行复制传入的字符串,那上面的malloc和strcpy可以调整;但通常链表节点应该持有独立的内存块。
  • 记得在不需要新链表时,遍历释放每个节点的w字段和节点本身,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Joshua Larouche

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:17:05