嵌入式c用于存储地址的正确数据类型
在嵌入式32位mcu上,存储地址的正确数据类型是什么?我正在阅读的代码是菜单的一部分,它允许用户通过指定地址来检查内存的内容。变量嵌入式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
地址
声明为无符号整数
。这是最佳做法吗
#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:如果我们把标题作为问题,那么第一个注释是正确的:使用指向适当类型的指针是错误的。