【问题标题】:Output address of variable without printf %p不带 printf 的变量的输出地址 %p
【发布时间】:2016-05-27 10:31:31
【问题描述】:

我是 C 编程的一年级学生,所以我的技能/知识有限。我正在尝试在printf 上创建自己的实现,但是在检索和打印变量的地址时遇到了麻烦。使用printf,可以使用%p 输出变量的地址,我需要以某种方式复制%p

存储变量地址时,数据类型为int*,我不知道如何将这个地址写入屏幕(stdout)。

例如:

int i        = 123;
int *address = &i;

现在我将如何输出address(不是i 的值)?我尝试使用原始的printf 格式说明符进行测试。我尝试使用 %x, %s, %d, %lu...当我尝试输出 int*(整数指针)时,这一切都给了我一个错误。

谁能帮我输出地址?

【问题讨论】:

  • @Anders K。这将在 64 位机器上剪切 64 位地址的高 32 位。

标签: c printf


【解决方案1】:

您只能检查指针的位并使用 unsigned char 类型打印这些位:

unsigned char* a = ( unsigned char* )address;
for( size_t i = 0 ; i < sizeof( address ) ; i++ )
     printf( "%hhu" , a[i] );

如果指针是指向对象的指针,另一种选择是将指针转换为类型:intptr_tuintptr_t,但这些类型的可用性是由实现定义的。

【讨论】:

  • 它们应该从 C99 开始可用。
  • @Aconcagua 这些类型是可选的,因此取决于实现。
【解决方案2】:

如果是对象的地址,您可以执行以下操作:

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main(void)
{
  int a;
  uintptr_t uip = (uintptr_t) ((void*) &a);
  printf("address of a = 0x%"PRIXPTR, uip);
}

要打印函数的地址,您需要转到as proposed here

【讨论】:

  • 我没有找到任何禁止将函数指针转换为 uintptr_t 的内容。我错过了什么吗?
  • 我已经做到了:任何指针类型都可以转换为整数类型。 由于对象和函数指针类型在其他规则中有所区别,我认为 任何指针类型都适用于两者。
  • @2502: 好的,明白了:intptr_tuintptr_t 由标准保证仅保留有效 void* (7.20.1.4/1) 的值。函数不能转换为void*
  • @2501:对不起,你的名字拼错了。然而有趣的错字... ;-)
  • 所以我推断:以前强制转换为 void* 已过时,您只需使用 (uintptr_t) &amp;a;...
猜你喜欢
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 2013-07-12
  • 2012-05-04
  • 1970-01-01
  • 2013-03-27
相关资源
最近更新 更多