【问题标题】: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:不要这样做!使用链接器和部分。

标签: c memory cortex-a8


【解决方案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 中指针算法的工作原理。

【讨论】:

  • 第一行至少触发警告!
  • 非常感谢。
猜你喜欢
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 2018-03-27
  • 1970-01-01
相关资源
最近更新 更多