C++ Syscall param socketcall.recvfrom(buf)指向不可寻址字节

C++ Syscall param socketcall.recvfrom(buf)指向不可寻址字节,c++,sockets,valgrind,C++,Sockets,Valgrind,运行此方法时,调用socket.getBytes void Client::register(VMap::VType type, char *id) { const int sizeOfType = sizeof(type); char *buffer = (char *) malloc(sizeOfType); memcpy(buffer, &type, sizeOfType); socket.send(buffer, sizeOfType);

运行此方法时,调用
socket.getBytes

void Client::register(VMap::VType type, char *id)
{
    const int sizeOfType = sizeof(type);
    char *buffer = (char *) malloc(sizeOfType);
    memcpy(buffer, &type, sizeOfType);
    socket.send(buffer, sizeOfType);
    sleep(1);
    char *bufferRecv = (char *) malloc(sizeOfType);
    memset(bufferRecv, 0 ,sizeOfType);
    int size = socket.getBytes(bufferRecv);

    free(buffer);
    free(bufferRecv);
}


int Socket::getBytes(char *buf)
{
    int ret = ::recv(m_sock, buf, MAXRECV, 0);

    return ret;
}
错误是:

==30653== Syscall param socketcall.recvfrom(buf) points to unaddressable byte(s)
==30653==    at 0x58C214C: recv (recv.c:34)
==30653==    by 0x4E47B84: pippo::Socket::getBytes(char*) (Socket.cpp:115)
==30653==    by 0x4E48BAE: pippo::Rossi::register(pippo::sMap::Type, char*) (Rossi.cpp:80)
==30653==    by 0x4E48EEE: pippo::Rossi::initsMap(std::string) (Rossi.cpp:111)
==30653==    by 0x4E486B0: pippo::Rossi::Rossi(std::string, std::string, std::string, unsigned int) (Rossi.cpp:54)
==30653==    by 0x4E45884: test::TestRossi::testConstructor() (TestRossi.cpp:70)
==30653==    by 0x4E456D8: test::TestRossi::testBody() (TestRossi.cpp:48)
==30653==    by 0x5288D03: test::TestUnit::test() (TestUnit.cpp:42)
==30653==    by 0x5288513: test::TestRunner::run() (TestRunner.cpp:44)
==30653==    by 0x407F26: main (TestDUMBO.cpp:125)
==30653==  Address 0x67a9d64 is 0 bytes after a block of size 4 alloc'd
==30653==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30653==    by 0x4E48B21: pippo::Rossi::register(pippo::sMap::Type, char*) (Rossi.cpp:76)
==30653==    by 0x4E48EEE: pippo::Rossi::initsMap(std::string) (Rossi.cpp:111)
==30653==    by 0x4E486B0: pippo::Rossi::Rossi(std::string, std::string, std::string, unsigned int) (Rossi.cpp:54)
==30653==    by 0x4E45884: test::TestRossi::testConstructor() (TestRossi.cpp:70)
==30653==    by 0x4E456D8: test::TestRossi::testBody() (TestRossi.cpp:48)
==30653==    by 0x5288D03: test::TestUnit::test() (TestUnit.cpp:42)
==30653==    by 0x5288513: test::TestRunner::run() (TestRunner.cpp:44)
==30653==    by 0x407F26: main (TestDUMBO.cpp:125)
我真的不明白怎么了。例如,如果我只是使用
sprintf
bufferRecv
中写入,我不会得到任何错误

::recv的原型如下所示:

/* Read N bytes into BUF from socket FD.
   Returns the number read or -1 for errors.

   This function is a cancellation point and therefore not marked with
   __THROW.  */
extern ssize_t recv (int __fd, void *__buf, size_t __n, int __flags);

编辑另一个信息:如果我像这样声明缓冲区
char bufferRecv[4]我没有从Valgrind得到任何错误。

对于其他有相同问题的人: 根据@alk的建议,我简单地将getBytes方法更改如下:

int Socket::getBytes(char *buf, int sizeOfBuf)
{
    int ret = ::recv(m_sock, buf, sizeOfBuf, 0);


    return ret;
}

什么是
MAXRECV
?无论如何,您应该传递给
recvfrom()
分配给传递的缓冲区的实际大小@alk I将MAXRECV设置为500,而发送的数据仅为4字节。你的意思是在这种情况下我应该放4?是的,这很有意义…@alk仅供参考,将大小作为参数修复了我的问题!谢谢你也许愿意接受你自己的回答。是的,对,但我不能在两天前接受。如果你想在另一个答案中复制它,我将接受你的答案并删除此答案