为什么带有%p指针格式说明符的printf在AVR而不是地址上打印垃圾字符?

时间:2019-02-15 16:16:30

标签: c avr

我看过How to find the address of a variable when using AVR?-得出的结论基本上是:

  在嵌入式目标上的

printf()调试有点复杂,您需要仔细研究并弄清楚是否存在将printf()与串行端口连接的代码,依此类推。另外,完整的printf()可能会有点沉重,因此也许您已经在使用精简的标准库。这不是编译器的责任,您需要弄清楚它是如何实现的。

...但是我无法真正弄清楚为什么发生我的这个问题。

我有一个变量,希望用作“字符串数组”,并希望对其进行malloc和realloc:

char** my_array = malloc(sizeof(char*)*1);

然后,我将printf重定向到USB串行端口的“打印”,然后在串行终端中读取了打印输出。

据我所知,用于printf的%p格式说明符应将变量的地址打印为十六进制数。我有一个这样的声明:

printf("my_array %p\r\n", (void *)&my_array);

我也尝试过:

printf("my_array %p\r\n", &my_array);
printf("my_array %p\r\n", my_array);

在所有情况下,我得到的打印输出都是这样的:

my_array  ▒▒▒ꓣ▒▒▒▒/▒▒f'w'▒`$▒▒W*▒▒X▒f'w'▒`$▒▒Y*▒▒Z▒f'w'▒`▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒#▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒j▒{▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒i▒z▒▒`$▒▒

...显然不是十六进制数。

为什么会这样,我在做什么错?在AVR中,如何获取以十六进制数字打印的变量的地址?如果有关系,我可以使用CodeVisionAVR编译器...


编辑:发现了这一点

https://www.avrfreaks.net/forum/format-specifier-pointers-0

  

但是人们确实使用%p,尤其是在AVR上。在AVR上,指针是一个16位无符号数字。我通常只使用%04X或自己的东西。

     

(好吧,我刚刚意识到这个论坛可能意味着32位ARM或UC3,我想这里的指针是32位?即使在这种情况下也是%08X)

...所以我只是改用了:

printf("my_array %08X\r\n", (void *)&my_array);

...现在我得到打印输出:

my_array 00003FFB

...但是现在我不知道这是否是实际地址:)

1 个答案:

答案 0 :(得分:1)

您可以将指针投射到uintptr_t并打印:

printf("my_array %llu\r\n", (unsigned long long)(uintptr_t)&my_array);