我正在尝试使用指针写入内存,如下所示,但它正在写入意外的地址。
uint32_t* pointer = (uint32_t) (__MEMORY_BASE)
*(pointer+4) = data;
使用下面的按预期工作时,
uint32_t* pointer = (uint32_t) (__MEMORY_BASE + 4)
*pointer = data;
任何人都可以告诉我,为什么我无法使用第一种方法写入指针地址。
答案 0 :(得分:4)
对于任何指针p
和索引i
,表达式*(p + i)
等于p[i]
。
这意味着什么时候
*(pointer + 4) = data;
你实际上在做什么
pointer[4] = data;
这意味着您从4 * sizeof(*pointer)
写入 字节 -offset pointer
。即你在__MEMORY_BASE
之外写了16个字节。
要正确使用第二个变体,或对第一个变体使用pointer[1]
(或*(pointer + 1)
)。
答案 1 :(得分:0)
uint32_t* pointer = (uint32_t) (__MEMORY_BASE);
*(pointer+4) = data;
因为pointer
的类型为uint32_t *
,这意味着
指针+ 1 = __MEMORY_BASE + 4,指针+ 4 = __MEMORY_BASE + 16,
这就是指针算法在C
中的工作原理。
答案 2 :(得分:0)
uint32_t
是4字节的整数类型。 C中的指针加法是指尖类型大小(以及它的倍数)。
所以pointer+4
向pointer
添加16(4 * 4),但在第二种情况下,你有4个字节的偏移量。
答案 3 :(得分:0)
我认为你不理解指针算术
在第一个添加指向对象(uint32_t)的长度是4个字节,所以你要添加到指针4,实际地址将加上4 * 4个字节。
在第二个示例中,您将4添加到实际地址。