如何在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
相关产品推荐
相关产品推荐

