【问题标题】:Cannot update pointer value无法更新指针值
【发布时间】:2019-09-22 21:00:57
【问题描述】:

我可能对指针的工作方式有一个基本的误解,但我认为我可以为指针分配一个变量值,但是每当我打印指针的取消引用值时,它总是 0 而不是“时间戳”的值。

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

uint32_t timestamp = 0x1111;

*myAddress = timestamp;

【问题讨论】:

  • 你需要使用有效的指针,看我的回答
  • 地址0x12341234指向什么?
  • 是什么让您相信您可以在0x12341234 地址上写任何东西?

标签: c


【解决方案1】:
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;

地址必须具有物理意义——即它必须是有效的。

您可能不是,您遇到了硬件或内存故障。

【讨论】:

    【解决方案2】:

    无法更新指针值

    你的意思是不能更新指向的值

    在做

     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 $ 
    

    【讨论】:

    • 你好 @chqrlie 我在几分钟前看到了 stackoverflow.com/questions/8513169/… :-) 我以前不知道它存在
    • %#x 会将unsigned int 值转换为带有0x 前缀的十六进制表示,除非该值是0。它并不严格等同于0x%x,但便于调试。
    • @chqrlie 是的,我看到在我放链接的问题中,坦率地说兴趣非常有限,不确定是否值得花时间在 lib 中实现它并记录它^^
    • 事后看来,许多标准 C 库函数可能会以不同的方式指定,有些永远不会成为标准...例如 gets()strncpy()
    • 关于你喜欢什么,又是min/max problem,那个时候我把你​​的顺序倒过来(如果我没记错的话)^^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2021-03-13
    • 2020-10-16
    • 2015-12-11
    相关资源
    最近更新 更多