C++中realloc转换void*到Guess*报错及字母排序建议求助
问题解决与优化建议
1. 修复realloc类型转换错误
C++不允许void*(realloc的返回类型)隐式转换为自定义指针类型Guess*,必须显式强制转换:
guessKeeper = static_cast<Guess*>(realloc(guessKeeper, (count+1)*sizeof(struct Guess)));
推荐使用C++风格的static_cast,比C风格强制转换(Guess*)的类型安全性更高。
2. 结构体设计优化
Guess结构体里的char Letter[1]完全冗余,单个字符直接用char Letter即可,既简化代码又避免数组操作的潜在问题:
struct Guess { char Letter; };
对应的输入代码也可简化为:
cin >> newGuess.Letter;
3. 代码逻辑完善
当前代码仅处理一次输入请求,需改用while循环实现多次输入;同时必须检查realloc的返回值,避免内存分配失败导致空指针或内存泄漏:
char choice = 'y'; struct Guess* guessKeeper = nullptr; // 显式初始化指针 int count = 0; while (choice == 'y' || choice == 'Y') { struct Guess newGuess; cout << "What is your guess? \n"; cin >> newGuess.Letter; // 用临时指针接收realloc结果,避免分配失败丢失原内存地址 Guess* temp = static_cast<Guess*>(realloc(guessKeeper, (count+1)*sizeof(struct Guess))); if (temp == nullptr) { cout << "Memory allocation failed!\n"; free(guessKeeper); // 释放已分配的内存 return 1; } guessKeeper = temp; count++; guessKeeper[count-1] = newGuess; cout << "Do you want to add another guess? \n"; cin >> choice; } free(guessKeeper); // 程序结束前释放内存
4. 字母排序建议
C++标准库方案(推荐)
引入<algorithm>头文件,使用std::sort直接对存储猜字母的数组排序:
#include <algorithm> #include <cctype> // 用于大小写转换(可选) // 按字母升序排序(区分大小写) std::sort(guessKeeper, guessKeeper + count, [](const Guess& a, const Guess& b) { return a.Letter < b.Letter; }); // 忽略大小写排序 std::sort(guessKeeper, guessKeeper + count, [](const Guess& a, const Guess& b) { return tolower(a.Letter) < tolower(b.Letter); });
C风格方案(兼容旧代码)
使用qsort函数,需自定义比较逻辑:
// 自定义比较函数 int compareGuess(const void* a, const void* b) { const Guess* guessA = static_cast<const Guess*>(a); const Guess* guessB = static_cast<const Guess*>(b); return guessA->Letter - guessB->Letter; } // 调用排序 qsort(guessKeeper, count, sizeof(Guess), compareGuess);
内容的提问来源于stack exchange,提问作者Rowan Frady
相关产品推荐
相关产品推荐

