C语言 使用指针写入内存



我正在尝试使用如下指针写入内存,但它正在写入意外的地址。

uint32_t* pointer = (uint32_t) (__MEMORY_BASE)
*(pointer+4)      = data;

在下面使用它按预期工作时,

uint32_t* pointer = (uint32_t) (__MEMORY_BASE + 4)
*pointer      = data;

任何人都可以让我知道,我无法使用第一种方法写入指针地址。

对于任何指针p和索引i,表达式*(p + i)等于p[i]

这意味着当你这样做时

*(pointer + 4) = data;

你实际上在做

pointer[4] = data;

这意味着您从pointer写入字节偏移量4 * sizeof(*pointer),即您写入超出__MEMORY_BASE的16个字节。

为了正确起见,请使用第二个变体,或者对第一个变体使用pointer[1](或*(pointer + 1)(。

uint32_t是 4 个字节的整数类型。C 中的指针加法以指针类型大小的术语(和倍数(表示。

因此,pointer+4pointer增加了 16 (4*4(,但在第二种情况下,您的偏移量为 4 个字节。

我认为你不了解指针算法

在第一个中,您添加的指向对象 (uint32_t( 长度为 4 个字节,因此添加到指针 4 的实际地址将为加 4 * 4 字节。

在第二个示例中,您将 4 添加到实际地址。

uint32_t* pointer = (uint32_t) (__MEMORY_BASE);
*(pointer+4)      = data;

因为pointer有类型uint32_t *,这意味着 指针 + 1 = __MEMORY_BASE + 4,指针 + 4 = __MEMORY_BASE + 16, 这就是指针算术在C中的工作方式。

相关内容

  • 没有找到相关文章

最新更新