我try 将指针一次向前移动4096个字节,如下所示:

#include <stdint.h>
#include <stdio.h>
void calculate(void* a)
{
    uintptr_t stride = 4096; 
    uint64_t *buff = (uint64_t*)a;
    for (uintptr_t offset = 0; offset < 20000; offset += stride)
    {
        fprintf(stdout, "%s: stride = 0x%x offset = 0x%x buff = %p offset+buff = %p\n", __func__, stride, offset, buff, offset+buff);
    }
}

int main(void)
{
    void* address = 0x7f5b588d1000;

    calculate(address);

    return 0;
}

然而,这是当前的输出:

calculate: stride = 0x1000 offset = 0x0 buff = 0x7f5b588d1000 offset+buff = 0x7f5b588d1000
calculate: stride = 0x1000 offset = 0x1000 buff = 0x7f5b588d1000 offset+buff = 0x7f5b588d9000

如你所见,上面写着:

0x7f5b588d1000 + 0x1000 = 0x7f5b588d9000

为什么这个计算是错误的?结果显然应该是0x7f5b588d2000

推荐答案

指针运算是以指向的类型为单位进行的. 这意味着向类型uint64_t的指针添加stride会将指针向上移动stride个元素,而不是stride个字节,因此指针值增加stride * sizeof(uint64_t).

您应该将buff的类型更改为uint8_t *或简单地更改为unsigned char *.这将使地址上移给定的字节数.

uint8_t *buff = a;

还请注意,不一定要从void *点施法或从void *点施法.

C++相关问答推荐

使用SWI—Prolog的qsave_program生成二进制文件有什么好处?'

常数函数指针优化

为什么net/if.h在ifaddrs.h之前?

自定义变参数函数的C预处置宏和警告 suppress ?

在C++中通过空指针隐式访问常量变量的值

如何使用_newindex数组我总是得到错误的参数

是否定义了此函数的行为?

C代码可以在在线编译器上运行,但不能在Leetcode上运行

如何在VSCode中创建和使用我自己的C库?

pthread_create的用法

如何使这个While循环在新行上结束

使用C++中的字符串初始化 struct 时,从‘char*’初始化‘char’使指针变为整数,而不进行强制转换

C23标准是否向后兼容?

在下面的C程序中,.Ap0是如何解释的?

OMP并行嵌套循环

I';我试着从.txt文件中读取文本,并用c计算其中的单词数量

为什么 int32_t 和 int16_t 在 printf 输出中具有相同的位数?

为什么 Linux 共享库 .so 在内存中可能比在磁盘上大?

缺少 memset_s (C11) 的重要原因

一个按位表达式,当 mask 全部为零时返回 1,当 mask 全部为 1 时返回 x