C++客户端程序出现Segmentation fault段错误,寻求修复方案
C++客户端段错误问题修复方案
核心错误点定位
你遇到的valgrind报错全部来自main函数中hostn变量的错误定义与使用,以及后续字符串比较的逻辑错误:
- 错误1:野指针写入(对应Invalid write、未初始化值报错)
原代码错误声明了指针数组:
char *hostn[hostname.size()+1]; strcpy(*hostn, hostname.c_str());
这里char *hostn[N]是定义了长度为N的char指针数组,数组内的每个指针都是未初始化的野指针,*hostn取第一个野指针直接执行strcpy写入,属于非法内存访问,是触发段错误的直接原因。
正确写法是声明char数组而非指针数组:
char hostn[hostname.size() + 1]; strcpy(hostn, hostname.c_str());
调用call_socket时直接传hostn即可,不需要解引用。
- 错误2:字符串比较逻辑错误
原代码直接用char[]类型的username和std::string类型的terminated、doesnotexist做==比较,实际比较的是指针地址而非字符串内容,永远不会命中预期的分支逻辑。
正确写法是转成std::string后比较,或者用strcmp:
if (strcmp(username, terminated.c_str()) == 0)
或者:
if (std::string(username) == terminated)
- 额外优化点:read返回值处理
原代码未处理read返回0的情况(服务端主动断开连接),建议补充对n == 0的判断,避免读取空内容后无提示。
修复后核心代码片段
替换原main函数中hostn相关代码段即可:
hostname = "localhost"; // 修正为char数组,而非指针数组 char hostn[hostname.size() + 1]; strcpy(hostn, hostname.c_str()); // 后续call_socket调用直接传hostn if ((b = call_socket(hostn, s)) < 0)
替换字符串比较的代码段:
std::string recv_msg(username); if (recv_msg == terminated) { printf("%s\n", username); } else if (recv_msg == doesnotexist) { cout << "The username: " << usern << ", "; printf("%s\n", username); } else { cout << "The public key for " << usern << " is: "; printf("%s\n", username); }
内容的提问来源于stack exchange,提问作者mozfet12
相关产品推荐
相关产品推荐

