关于ZeroMemory的C ++帮助

时间:2018-02-21 22:14:31

标签: c++ winapi char

我像往常一样定义了我的char,尽管我将其命名为buf。我一直收到错误:

  

类型' char'的参数与' void *'

类型的参数不兼容

如果我将buf设置为void*,则无法将4096作为参数传递。

那么,我该如何解决这个问题呢?有没有人遇到这样的问题?

    char buf{4096};
    string userinput;
    do
    {
        cout << "> " << endl;
        getline(cin, userinput);


        if (userinput.size() > 0) // make sure the user typed something in  
        {
            int SendResult = send(sock, userinput.c_str, userinput.size() + 1, 0);
            if (SendResult != SOCKET_ERROR)
            {
                ZeroMemory(buf, 4096);
                int bytesReceived = recv(sock, buf, 4096, 0);
                if (bytesReceived > 0)
                {
                    cout << "SERVER" << string(buf, 0, bytesReceived) << 
endl;
                }
            }
        }

3 个答案:

答案 0 :(得分:5)

问题很可能是这个定义:

char buf{4096};

大致相当于:

char buf = 4096;

哪个是单个字符,而不是字符数组缓冲区。解决这个问题:

char buf[4096];

当你传递它时可能需要这样做:

ZeroMemory(&buf, 4096);

我强烈建议你避免在任何地方敲击4096,所以定义一个常数:

const SIZE_T buf_size = 4096;
char buf[buf_size];

// ...

ZeroMemory(&buf, buf_size);

答案 1 :(得分:0)

怎么样:

#include <array>   

std::array<char, 4096> buf;
...    

        std::fill(buf.begin(), buf.end(), 0);
        int bytesReceived = recv(sock, buf.data(), buff.size(), 0);
...

答案 2 :(得分:0)

另一个问题是为什么你需要ZeroMemory。我认为这里发生的是你选择了错误的字符串构造函数重载。让我解释一下:

您拥有buf缓冲区并且拥有bytesReceived长度的数据,所以您真正需要的只是

std::string(buf, bytesReceived)

构造有效的字符串。但是你选择了

std::string(buf, 0, bytesReceived)

此重载如下所示:

  

basic_string(const basic_string&amp; other,                 size_type pos,                 size_type计数,                 ..

buf在第一个参数处隐式转换为std::string,但为了使其正常工作,您的缓冲区需要以空终止,它可能是也可能不是。所以你通过将剩余的缓冲区归零来解决这个问题。如果您获得4096字节的非空终止数据,您认为会发生什么?在这种情况下,您的解决方法将无效。因此,只需使用上面提到的相应字符串构造函数,您就不需要使用ZeroMemory