我看到了How to find the address of a variable when using AVR? --其中的结论基本上是:
嵌入式目标上的printf()-debugging有点复杂,您需要深入研究并确定是否有代码将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..。但是现在我不知道这是否是一个真正的地址:)
发布于 2019-02-15 16:21:57
您可以将指针转换为uintptr_t并打印如下:
printf("my_array %llu\r\n", (unsigned long long)(uintptr_t)&my_array);https://stackoverflow.com/questions/54713185
复制相似问题