数组+整数指针(C ++)

时间:2016-03-09 12:37:33

标签: c++ c pointers buffer

我对C ++并不熟悉,所以我想问一下,下面的代码会做什么(我在现有的C ++项目中有它):

1: char* buf;
2: *buf = 0;
3: int readBytes = tcpSocket->read(buf, 10);
4: buf += readBytes;

解释很简单,从TCP Socket应该读取10个字节并将读取的字节存储在char * Buffer“buf”中。 返回值是读取的字节数。

但为什么我需要第4行? 或者更好的是第4行在做什么? 根据我的理解,它正在摧毁我的“buf”结果,不是吗?

我希望有人可以帮助我,也许可以解释一下,为什么我需要这一行4。

BR THW

2 个答案:

答案 0 :(得分:2)

TCP是流式协议,这意味着您收到的数据中没有消息边界。因此,可能无法在单个接收调用中获取所有数据,但必须循环并多次读取。

通过例如buf += readBytes您通过buf元素推进指针readBytes,因此下次收到数据时,将写入最后一次接收来电的位置。

除了使用和取消引用未初始化的指针之外,还有一些事情你需要修复,那就是你不能在循环中的每次迭代中读取固定数量的字节,你需要减少要由readBytes接收的数据。一旦读完所有数据,您还需要退出循环。

让我们将所有这些放在一个很好的函数中,它总是读取请求的数据量,例如:

// tcpSocket is the socket to receive data from (I don't know the actual type)
// buffer is the destination buffer, where the received data should be written
// len is the number of bytes to receive
// Pre-condition: buffer must point to memory of at least len bytes
bool read_data(TCPSocketType* tcpSocket, char* buffer, size_t len)
{
    // Loop while there are still bytes to read
    while (len > 0)
    {
        ssize_t readBytes = tcpSocket->read(buffer, len);
        if (readBytes <= 0)
        {
            // There was an error (readBytes < 0)
            // Or the connection was closed (readBytes == 0)
            return false;
        }

        buffer += readBytes;  // Next position to write data into
        len -= readBytes;  // We don't need to read as much now
    }

    return true;  // Now we have read all of the data
}

答案 1 :(得分:0)

第4行将指针前进到您读取的字节,以便例如在下次通话时,您不会覆盖以前的数据。

如注释中所述,第2行是未定义的行为,因为您没有将buf指针设置为已分配的内存。