char* buffer = new char[13]{};
//char buffer[13];
if (recv(clientSocket, buffer, sizeof(buffer), 0) == SOCKET_ERROR)
{
std::cout << "接受服务器信息失败!" << std::endl;
}
else
{
std::cout << buffer << std::endl;
}
网络协议编程,接收来自服务器发送的"hello world"信息时
这里为什么char* buffer = new char[13]{};输出的buffer是乱码
而char buffer[13];输出的buffer不是?
你这样得到的大小是指针的大小(一般是8)而不是13,你把sizeof(buffer)改成13试试
Sizeof求的是指针大小,不是数组大小,望采纳
【以下回答由 GPT 生成】
问题的根源在于对字符数组和动态数组的定义和使用上的不同。
在上述代码中,使用了动态数组(char* buffer = new char[13]{};)和字符数组(char buffer[13];)两种方式定义了一个长度为13的字符缓冲区。
问题出现在使用sizeof(buffer)获取缓冲区大小上。sizeof是一个在编译时就确定大小的运算符,对于动态数组指针buffer,其大小等于指针本身的大小(通常是4或8),而不是动态分配的数组的大小。
因此,在使用动态数组定义的buffer作为接收缓冲区时,实际上只接收了一个较小的数据块,导致输出的结果是乱码。
解决方案如下所示:
char* buffer = new char[13]{};
int dataSize = 13; // 定义接收的数据大小
if (recv(clientSocket, buffer, dataSize, 0) == SOCKET_ERROR)
{
std::cout << "接受服务器信息失败!" << std::endl;
}
else
{
std::cout << buffer << std::endl;
}
delete[] buffer; // 注意要释放动态分配的内存
在解决方案中,我们手动指定了接收的数据大小为13,确保接收到完整的数据。另外,使用动态数组定义的buffer要在使用完后进行内存释放,避免内存泄漏的问题。
注意:本答案基于问题中提供的代码和问题描述给出解决方案。如果问题存在其他因素或背景,请提供更多的信息以便准确解决。同时,网络编程中还需要考虑编码的问题,确保接收和输出的字符编码一致。