嵌入式c用于存储地址的正确数据类型

嵌入式c用于存储地址的正确数据类型,c,embedded,C,Embedded,在嵌入式32位mcu上,存储地址的正确数据类型是什么?我正在阅读的代码是菜单的一部分,它允许用户通过指定地址来检查内存的内容。变量地址声明为无符号整数。这是最佳做法吗 #define MemoryRead(A) (*(volatile unsigned long*)(A)) int debug monitor(void) { unsigned int address, value; for (;;) { ch = getchar(); address = 0; if

在嵌入式32位mcu上,存储地址的正确数据类型是什么?我正在阅读的代码是菜单的一部分,它允许用户通过指定地址来检查内存的内容。变量
地址
声明为
无符号整数
。这是最佳做法吗

  #define MemoryRead(A) (*(volatile unsigned long*)(A))

  int debug monitor(void) {

  unsigned int address, value;

  for (;;) {
  ch = getchar();

address = 0;

if (('0' <= ch && ch <= '9') || {
  putchar(ch);
  printf("\r\nAddress in hex> ");
  address = getnum();
  printf("Address = ");
  printf("%x\r\n",address);
}

switch(ch & 0x7f) {
  case '1':
     value = MemoryRead(address);
     printf("%x\r\n",value);
     break;
#定义MemoryRead(A)(*(易失性无符号长*)(A))
int调试监视器(void){
无符号整数地址,值;
对于(;;){
ch=getchar();
地址=0;

if(('0'No)。不能保证指针的大小与int相同,尽管对于32位体系结构来说这几乎是确定的

将地址作为整数类型保存的最佳类型是
uintpttr\t
,它在
stdint.h
中定义,保证足够长的时间来保存地址

保持通用指针不变的最佳类型是
void*

如果使用
uintptr\u t
或实际指针,即
void*
,则地址的
printf
格式说明符应为
%p


在您的代码中,用于打印MemoryRead结果的正确格式说明符是
无符号长的
%lx

地址的正确类型是地址指向的类型的指针。这与CPU的字宽无关。要打印指针值,请阅读
的手册页printf
%x
完全错误。只能保证
(u)intptr\u t
在其中存储
void*
并将其赋值回
void*
不变。无法保证打印值或以其他方式对其进行操作。代码要求更多一点。OP读取地址值(这充其量已经有问题了),并打印。大家好,我已经将完整的代码添加到了OP中。代码的工作原理是让您可以检查内存位置的内容,但我只想了解最佳实践,以及您是否可以演示如何在这种情况下使用指针,这将很有帮助。感谢转换到
uintpttr\t
是最正确的答案这是可以给出的。@Lundin:如果我们把标题作为问题,那么第一个注释是正确的:使用指向适当类型的指针是错误的。