我正在尝试使用如下指针写入内存,但它正在写入意外的地址。
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+4
pointer
增加了 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
中的工作方式。