使用指针写入内存[关闭]

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 中指针算法的工作原理。

【讨论】:

第一行至少触发警告! 非常感谢。

以上是关于使用指针写入内存[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使文件指针读/写到内存中的位置

指针为啥是不安全的呢?

从内存中读取图像,知道指向内存的指针。 VC++ [关闭]

我想写一个易语言程序按键改写指针的值 接下来该如何写?

python 文件处理 -- 01 文件打开&读取&写入&关闭&指针

C语言如何给指针分配内存?