【问题标题】:C++ Memory Address IncrementationC++ 内存地址递增
【发布时间】:2023-10-03 20:17:01
【问题描述】:

有没有办法让我获取一个内存地址并将其推进一定数量并存储在变量中?该变量类型必须是什么?

例如,在下面的代码中,我想首先查看数据 + 0,然后对于之后的每个步骤查看数据 + 发送。如果我没看错的话,send 存储为字节,data 是内存地址。

bool sendAll(int socket, const void *data, ssize_t size) {
    ssize_t sent = 0;
    ssize_t just_sent;
    while (sent < size) {
        just_sent = send(socket, data + sent, size - sent, 0);
        if (just_sent < 0) {
            return false;
        }
        sent += just_sent;
    }
    return true;
}

【问题讨论】:

    标签: c++ sockets memory byte send


    【解决方案1】:

    这就是char* 会做的事情。指针数学,当指针的类型为T* 时,始终以sizeof (T) 为增量工作。和 sizeof (char) == 1 的定义。

    那就试试吧:

    just_sent = send(socket, sent + (const char*)data, size - sent, 0);
    

    【讨论】:

    • 我上面的代码不起作用。我该怎么做才能让它工作?此外,这里使用的数据数组是一个 int 数组,作为 (void *)data 发送。
    • @Rick_Sch:只需将调用send 的一行替换为我的答案中的版本即可。
    • 你是神。严重地。你刚刚帮我弄清楚了需要几天才能完成的事情。
    • 请注意,您将 const void* 转换为 char* 并丢弃了 const 限定符。
    【解决方案2】:

    只是补充@Ben的答案,因为我认为“只需将调用发送的一行替换为我的答案中的版本。”不是一个很好的答案...

    @Rick,重要的是您知道传输了多少字节。无论数组是否是整数数组,如果您想从 sent-th byte 开始,您可以将 data 转换为 (char*) 以便编译器执行正确的指针运算(char*)data + sentsent 字节添加到 data。那是因为sizeof(char) == 1 字节。相反,如果您将data 转换为(int*),而不是移动sent 字节,您将移动sent * sizeof(int) 字节。

    【讨论】:

    • 那是评论,不是答案。我的回答确实(并且确实)解释了 char* 上的指针运算以 sizeof (char) == 1 为单位工作。