我看到了如何在使用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);