首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么带有%p指针格式说明符的printf会在AVR上而不是地址上打印垃圾字符?

为什么带有%p指针格式说明符的printf会在AVR上而不是地址上打印垃圾字符?
EN

Stack Overflow用户
提问于 2019-02-15 16:16:30
回答 1查看 172关注 0票数 0

我看到了How to find the address of a variable when using AVR? --其中的结论基本上是:

嵌入式目标上的printf()-debugging有点复杂,您需要深入研究并确定是否有代码将printf()与串口连接,等等。另外,一个完整的printf()可能有点重,所以您可能已经使用了一个精简的标准库。这不是编译器的责任,你需要弄清楚它是如何实现的。

..。但我真的搞不懂为什么会发生我的这个问题。

我有一个变量,我想充当一个“字符串数组”,我想要使用malloc和realloc:

代码语言:javascript
复制
char** my_array = malloc(sizeof(char*)*1);

然后,我将printf重定向为“打印”到USB串口,然后在串行终端上读取打印。

据我所知,printf的%p格式说明符应该将变量的入口打印为十六进制数。我有这样的声明:

代码语言:javascript
复制
printf("my_array %p\r\n", (void *)&my_array);

我也试过:

代码语言:javascript
复制
printf("my_array %p\r\n", &my_array);
printf("my_array %p\r\n", my_array);

在所有情况下,我得到的打印结果如下:

代码语言:javascript
复制
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在这种情况下)

..。所以我只是用:

代码语言:javascript
复制
printf("my_array %08X\r\n", (void *)&my_array);

..。现在我打印出来了:

代码语言:javascript
复制
my_array 00003FFB

..。但是现在我不知道这是否是一个真正的地址:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-15 16:21:57

您可以将指针转换为uintptr_t并打印如下:

代码语言:javascript
复制
printf("my_array %llu\r\n", (unsigned long long)(uintptr_t)&my_array);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54713185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档