关于ZeroMemory的C++帮助

Jac*_*tor -2 c++ winapi char

我像往常一样定义了我的char,虽然我把它命名了buf.我一直收到错误:

'char'类型的参数与'void*'类型的参数不兼容

如果我设置bufvoid*,它将无法传入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;
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

tad*_*man 5

问题很可能是这个定义:

char buf{4096};
Run Code Online (Sandbox Code Playgroud)

这大致相当于:

char buf = 4096;
Run Code Online (Sandbox Code Playgroud)

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

char buf[4096];
Run Code Online (Sandbox Code Playgroud)

通过时,您可能需要这样做:

ZeroMemory(&buf, 4096);
Run Code Online (Sandbox Code Playgroud)

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

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

// ...

ZeroMemory(&buf, buf_size);
Run Code Online (Sandbox Code Playgroud)

  • 由于`buf`是一个固定数组,传递它的名称与将指针传递给它的第一个元素是一样的,所以你根本不需要`&`:`ZeroMemory(buf,sizeof(buf));`另一方面,在这个例子中,在调用`recv()`之前根本没有必要将`buf`归零,这只是浪费的开销. (2认同)