Objective c 打印指针地址和符号地址之间的差异

Objective c 打印指针地址和符号地址之间的差异,objective-c,c,pointers,memory-address,Objective C,C,Pointers,Memory Address,上述代码返回以下内容: int firstInt =10; int *pointerFirstInt = &firstInt; printf("The address of firstInt is: %u", &firstInt); printf("\n"); printf("The address of firstInt is: %p", pointerFirstInt); printf("\n"); 我知道0x7fff5fbff7cc是十六进制的,但当我尝试将该数字转换

上述代码返回以下内容:

int firstInt =10;
int *pointerFirstInt = &firstInt;


printf("The address of firstInt is: %u", &firstInt);
printf("\n");
printf("The address of firstInt is: %p", pointerFirstInt);
printf("\n");

我知道
0x7fff5fbff7cc
是十六进制的,但当我尝试将该数字转换为十进制时,它并不等于
1606416332
。为什么会这样?两者不应该返回相同的内存地址吗?

原因如下:

C11:7.21.6: 如果转换规范无效,如果任何参数无效,则行为未定义 对应转换规范的类型不正确,行为为 未定义


原因在于:

C11:7.21.6: 如果转换规范无效,如果任何参数无效,则行为未定义 对应转换规范的类型不正确,行为为 未定义


从你的十六进制地址-

The address of firstInt is: 1606416332
The address of firstInt is: 0x7fff5fbff7cc
地址的大小为6字节长。但是
unsignedint
的大小是4字节。当您试图使用
%u
打印地址时,将导致未定义的行为


因此,请始终使用十六进制地址中的
%p

打印地址-

The address of firstInt is: 1606416332
The address of firstInt is: 0x7fff5fbff7cc
地址的大小为6字节长。但是
unsignedint
的大小是4字节。当您试图使用
%u
打印地址时,将导致未定义的行为


因此,请始终使用
%p

打印地址。您似乎正在64位机器上工作。所以你的指针是64位长

两者(
&firstInt
指针firstInt
)完全相同。但它们的显示方式不同。
“%p”
知道指针是64位的,并以十六进制显示<代码>“%u”显示十进制数并假定为32位。所以只显示了一部分

如果将
1606416332
转换为十六进制,它看起来像:
0x5FBFF7CC
。您可以看到,这是64位地址的下半部分

编辑: 进一步解释:

因为printf是一个var arg函数,所以您给它的所有参数都放在堆栈上。因为在这两种情况下,您都在其上放置了8字节。由于PC机使用的是小端字节,所以较低的字节首先放在它上面。
printf函数解析字符串并到达
%[DatatypeSpecifier]
点,从堆栈中读取DatatypeSpecifier引用的数据类型所需的字节数。因此,在
“%u”
的情况下,它只读取4个字节,而忽略其他字节。由于您编写的是
“%u”
,而不是
“%x”
,因此它以十进制形式显示值,而不是十六进制形式。

您似乎在一台64位机器上工作。所以你的指针是64位长

两者(
&firstInt
指针firstInt
)完全相同。但它们的显示方式不同。
“%p”
知道指针是64位的,并以十六进制显示<代码>“%u”显示十进制数并假定为32位。所以只显示了一部分

如果将
1606416332
转换为十六进制,它看起来像:
0x5FBFF7CC
。您可以看到,这是64位地址的下半部分

编辑: 进一步解释:

因为printf是一个var arg函数,所以您给它的所有参数都放在堆栈上。因为在这两种情况下,您都在其上放置了8字节。由于PC机使用的是小端字节,所以较低的字节首先放在它上面。
printf函数解析字符串并到达
%[DatatypeSpecifier]
点,从堆栈中读取DatatypeSpecifier引用的数据类型所需的字节数。因此,在
“%u”
的情况下,它只读取4个字节,而忽略其他字节。由于您编写的是
%u”
而不是
%x”
,因此它以十进制而不是十六进制形式显示值。

%u
无符号int
格式,长度可能为32位。你的指针明显大于32位。。。在对printf()的两个调用中都应该使用
%p
格式。
0x7fff5fbff7cc-1606416332==0x7fff5fbff7cc-0x5fbff7cc==0x7fff0000000
%u
无符号int
格式,长度可能为32位。你的指针明显大于32位。。。在对printf()的两个调用中都应该使用
%p
格式。
0x7fff5fbff7cc-1606416332==0x7fff5fbff7cc-0x5fbff7cc==0x7fff0000000
正确吗?@JustinO'Brien是的!没错!。但是如果您想使用
%lu
打印,并将其转换为十六进制,请参阅。因此,如果不使用指针,则此
printf(“firstInt的地址为:%p”,&firstInt)正确吗?@JustinO'Brien是的!没错!。但根据您的问题,如果要使用
%lu
打印并将其转换为十六进制,请参见。