使用指针写入内存[关闭]
Posted
技术标签:
【中文标题】使用指针写入内存[关闭]【英文标题】:Writing to memory using pointer [closed] 【发布时间】:2017-07-27 10:43:56 【问题描述】:我正在尝试使用如下指针写入内存,但它正在写入意外地址。
uint32_t* pointer = (uint32_t) (__MEMORY_BASE)
*(pointer+4) = data;
虽然使用下面它按预期工作,
uint32_t* pointer = (uint32_t) (__MEMORY_BASE + 4)
*pointer = data;
谁能告诉我,为什么我不能使用第一种方法写入指针地址。
【问题讨论】:
了解指针和指针算法。4
-> 1
。并使用ideomatic 方式通过供应商提供的 (CMSIS) 标头访问硬件外围寄存器。由于其他原因,此代码也不会真正起作用。如果它访问 RAM:不要这样做!使用链接器和部分。
【参考方案1】:
对于任何指针p
和索引i
,表达式*(p + i)
等于p[i]
。
这意味着当你这样做时
*(pointer + 4) = data;
你确实在做
pointer[4] = data;
这意味着您从pointer
写入字节-offset 4 * sizeof(*pointer)
。 IE。你在__MEMORY_BASE
之外写了16个字节。
为了正确,要么使用第二个变体,要么使用pointer[1]
(或*(pointer + 1)
)和第一个变体。
【讨论】:
非常感谢。【参考方案2】:uint32_t
是一个 4 字节的整数类型。 C 中的指针加法是指针类型大小的(和倍数)。
所以pointer+4
将 16 (4*4) 添加到 pointer
但在第二种情况下,您有 4 个字节的偏移量。
【讨论】:
非常感谢。【参考方案3】:我认为你不了解指针算法
在第一个中,您添加的指向对象 (uint32_t) 是 4 字节长,所以如果您添加到指针 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
中指针算法的工作原理。
【讨论】:
第一行至少触发警告! 非常感谢。以上是关于使用指针写入内存[关闭]的主要内容,如果未能解决你的问题,请参考以下文章