【问题标题】:Pointer of Array + Integer (C++)数组指针 + 整数 (C++)
【发布时间】:2016-03-09 12:37:33
【问题描述】:

我对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 总价

【问题讨论】:

  • 此处未定义行为" *buf = 0;。您的指针未指向任何可以取消引用的地方。
  • buf += readBytes 正在移动读取字节末尾的指针。可能让对tcpSocket->read 的下一次调用在已经读取的字节之后开始写入。但正如 juanchopanza 所说,在buf 显示的代码中,无论如何都没有初始化。当然,如果您想稍后使用它,您必须将原始起始指针保存在某个地方。
  • 您需要将buf 指向实际的缓冲区。类似char data[10]; char* buf = data;
  • 感谢您的回答,这对我很有帮助。

标签: c++ c pointers buffer


【解决方案1】:

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
}

【讨论】:

  • 感谢分析器,指针移动很有意义。但是如果指针在末尾一次,然后函数被返回,那么调用函数的指针是不是在开头呢?还是最后还在?因为我找不到将指针再次移到开头的任何东西。
  • @ThW 指针是传值的,也就是说函数得到了一份拷贝。修改一个副本不会修改原来的,所以你调用函数时使用的指针不会被修改,仍然会指向缓冲区的开头。
  • 太好了,感谢所有快速回答。这解决了我的问题!谢谢大家!
【解决方案2】:

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

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

【讨论】:

  • 您需要说明比“第 2 行不起作用”更好的内容。它可以工作,也可以失败,它可能会产生分段错误,而且通常它可以做很多事情。
猜你喜欢
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 2017-02-12
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多