【发布时间】:2019-02-15 16:16:30
【问题描述】:
我看过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
...但现在我不知道这是否是实际地址:)
【问题讨论】: