C 不带printf%p的变量的输出地址
我是C编程的一年级学生,所以我的技能/知识有限。我正试图在C 不带printf%p的变量的输出地址,c,printf,C,Printf,我是C编程的一年级学生,所以我的技能/知识有限。我正试图在printf上创建自己的实现,但在检索和打印变量地址时遇到了问题。使用printf,可以用%p输出变量的地址,我需要以某种方式复制%p 存储变量的地址时,数据类型为int*,我不知道如何将此地址写入屏幕(stdout) 例如: 现在,我如何输出地址(而不是I处的值)?我尝试使用原始的printf格式说明符进行测试。我尝试使用%x、%s、%d、%lu。。。当我试图输出一个int*(整数指针)时,这都给了我一个错误 有人能帮我输出地址吗?您只
printf
上创建自己的实现,但在检索和打印变量地址时遇到了问题。使用printf
,可以用%p
输出变量的地址,我需要以某种方式复制%p
存储变量的地址时,数据类型为int*
,我不知道如何将此地址写入屏幕(stdout)
例如:
现在,我如何输出地址
(而不是I
处的值)?我尝试使用原始的printf
格式说明符进行测试。我尝试使用%x、%s、%d、%lu。。。当我试图输出一个int*
(整数指针)时,这都给了我一个错误
有人能帮我输出地址吗?您只能检查指针的位并使用类型unsigned char打印这些位:
unsigned char* a = ( unsigned char* )address;
for( size_t i = 0 ; i < sizeof( address ) ; i++ )
printf( "%hhu" , a[i] );
unsigned char*a=(unsigned char*)地址;
对于(大小i=0;i
如果指针是指向对象的指针,另一个选项是将指针强制转换为类型:
intptr\u t
或uintptr\u t
,但这些类型的可用性是由实现定义的。您只能检查指针的位,并使用类型unsigned char打印这些位:
unsigned char* a = ( unsigned char* )address;
for( size_t i = 0 ; i < sizeof( address ) ; i++ )
printf( "%hhu" , a[i] );
unsigned char*a=(unsigned char*)地址;
对于(大小i=0;i
另一个选项是,如果指针是指向对象的指针,则将指针强制转换为类型:
intptr\u t
或uintptr\u t
,但这些类型的可用性由实现定义。如果是针对对象的地址,则可以执行以下操作:
#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);
}
#包括
#包括
#包括
内部主(空)
{
INTA;
uintptr_t uip=(uintptr_t)((void*)和a);
printf(“a=0x%的地址”PRIXPTR,uip);
}
要打印函数的地址,您需要转到。如果是对象的地址,您可以执行以下操作:
#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);
}
#包括
#包括
#包括
内部主(空)
{
INTA;
uintptr_t uip=(uintptr_t)((void*)和a);
printf(“a=0x%的地址”PRIXPTR,uip);
}
要打印函数的地址,您需要转到。它们应该从C99开始可用。@Aconcagua这些类型是可选的,因此这取决于实现。它们应该从C99开始可用。@Aconcagua这些类型是可选的,因此,这取决于实现。我没有发现任何禁止将函数指针强制转换到uintptr\t的内容。我错过了什么吗?我已经错过了:任何指针类型都可以转换为整数类型。由于在其他规则中对对象指针类型和函数指针类型进行了区分,我认为任何指针类型都适用于这两种类型。@2502:好的,明白了:
intptr\u t
和uintptr\u t
由标准保证只保留有效的void*
(7.20.1.4/1)的值。由于拼写错误,函数不能转换为void*
@2501:Sry。有趣的打字错误…;-)因此,我推断:强制转换为void*以前是过时的,您只需使用(uintpttr\t)&a代码>…我没有发现任何禁止将函数指针强制转换到uintptr\t的内容。我错过了什么吗?我已经错过了:任何指针类型都可以转换为整数类型。由于在其他规则中对对象指针类型和函数指针类型进行了区分,我认为任何指针类型都适用于这两种类型。@2502:好的,明白了:intptr\u t
和uintptr\u t
由标准保证只保留有效的void*
(7.20.1.4/1)的值。由于拼写错误,函数不能转换为void*
@2501:Sry。有趣的打字错误…;-)因此,我推断:强制转换为void*以前是过时的,您只需使用(uintpttr\t)&a代码>..@Anders K。这将在64位机器上剪切64位地址的上32位。@Anders K。这将在64位机器上剪切64位地址的上32位。