我看过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
...但是现在我不知道这是否是实际地址:)
答案 0 :(得分:1)
您可以将指针投射到uintptr_t
并打印:
printf("my_array %llu\r\n", (unsigned long long)(uintptr_t)&my_array);