无法更新指针值

时间:2019-05-04 16:36:15

标签: c

我可能对指针的工作原理有一个基本的误解,但我认为我可以为指针分配一个变量值,但是,每当我打印指针的取消引用的值时,该值始终为0,而​​不是'timestamp'的值。

volatile uint32_t *myAddress = (volatile uint32_t*)0x12341234;

uint32_t timestamp = 0x1111;

*myAddress = timestamp;

2 个答案:

答案 0 :(得分:4)

  

无法更新指针值

您的意思是无法更新指标值

 volatile uint32_t *myAddress = (volatile uint32_t*)0x12341234;

 uint32_t timestamp = 0x1111;

 *myAddress = timestamp;

您使用(很可能是)无效的地址0x12341234来引用它具有未定义的行为

做这样的事情:

uint32_t v;

volatile uint32_t *myAddress = &v;

uint32_t timestamp = 0x1111;

*myAddress = timestamp;
// now v values 0x1111

示例:

#include <stdio.h>
#include <stdint.h>

int main()
{
  uint32_t v = 0;

  volatile uint32_t *myAddress = &v;

  uint32_t timestamp = 0x1111;

  *myAddress = timestamp; // now v values 0x1111

  printf("0x%x 0x%x\n", (unsigned) v, (unsigned) *myAddress);

  return 0;
}

编译和执行:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
0x1111 0x1111
pi@raspberrypi:/tmp $ 

答案 1 :(得分:0)

volatile uint32_t *myAddress = (volatile uint32_t*)0x12341234;

这种固定地址指针通常在uC开发中用于访问存储器映射的硬件寄存器或精确地址处的存储器。

例如:

(ARM STM32)

volatile uint32_t *initialSP = (volatile uint32_t *)(0x8000000);

#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
GPIOA -> MODER = value;

地址必须具有物理意义-即必须有效。

您可能不是,并且出现硬件或内存故障。