我可能对指针的工作原理有一个基本的误解,但我认为我可以为指针分配一个变量值,但是,每当我打印指针的取消引用的值时,该值始终为0,而不是'timestamp'的值。
volatile uint32_t *myAddress = (volatile uint32_t*)0x12341234;
uint32_t timestamp = 0x1111;
*myAddress = timestamp;
答案 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;
地址必须具有物理意义-即必须有效。
您可能不是,并且出现硬件或内存故障。