为什么字符数组和动态数组,分别输出,动态数组是乱码?


    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要在使用完后进行内存释放,避免内存泄漏的问题。

注意:本答案基于问题中提供的代码和问题描述给出解决方案。如果问题存在其他因素或背景,请提供更多的信息以便准确解决。同时,网络编程中还需要考虑编码的问题,确保接收和输出的字符编码一致。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^