C-为什么使用%p Pointer格式的PRINTF在AVR上打印垃圾chars而不是地址



我看到了如何在使用AVR时找到变量的地址? - 基本上是:

printf() - 在嵌入式目标上调试有点复杂,您需要挖掘并找出是否有代码可以将printf()与串行端口连接,依此类推。另外,完整的printf()可能有点重,因此也许您已经使用了修剪式标准库。这不是编译器的责任,您需要弄清楚它是如何实施的。

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

我有一个变量,我想充当"字符串数组",我想malloc和realloc:

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

然后,我将printf重定向到"打印"到USB串行端口,然后在串行终端阅读打印输出。

据我所知,printf的%p格式指定器应打印一个变量的adress作为十六进制数字。我有这样的陈述:

printf("my_array %prn", (void *)&my_array);

我也尝试了:

printf("my_array %prn", &my_array);
printf("my_array %prn", 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 %08Xrn", (void *)&my_array);

...现在我被打印出来:

my_array 00003FFB

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

您可以将指针施放为uintptr_t并打印为:

printf("my_array %llurn", (unsigned long long)(uintptr_t)&my_array);

最新更新