C++ 内存地址递增

Posted

技术标签:

【中文标题】C++ 内存地址递增【英文标题】:C++ Memory Address Incrementation 【发布时间】:2012-10-19 10:02:49 【问题描述】:

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

例如,在下面的代码中,我想首先查看数据 + 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;

【问题讨论】:

【参考方案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 为单位工作。

以上是关于C++ 内存地址递增的主要内容,如果未能解决你的问题,请参考以下文章

C++ 函数挂钩(仅限内存地址)

C++或者C#如何读取指定内存地址的值?

C++中关于new及内存地址的思考

C++内存管理机制

C++ 仅读取进程范围内的内存地址

在特定内存地址创建新的 C++ 对象?