【问题标题】:what does %d print for &variable instead of %p in C [duplicate]%d 为 &variable 而不是 C 中的 %p 打印什么 [重复]
【发布时间】:2017-04-03 21:53:11
【问题描述】:

此代码将打印 my_age 和我的年龄的内存地址。

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 

int my_age = 24;        
printf("%d \t %p",my_age, &my_age); 
}

但是当我使用 %d 而不是 %p 时,它会打印一个不同的值,那个值是什么??

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 

int my_age = 24;        
printf("%d \t %d",my_age, &my_age); 
}

【问题讨论】:

  • %p 是指针地址的说明符
  • 如果您使用了错误的格式说明符,则会调用 ub。你的程序实际上可以做到anything
  • 你的编译器应该给出警告!如果没有,请使用另一个!
  • printf("%d \t %p",my_age, &amp;my_age); 应该是 printf("%d \t %p",my_age, (void*)&amp;my_age); 但是问为什么豆子不是胡萝卜是无稽之谈。也许你有 32 位 int 和 64 位 int*
  • 当您使用不同的格式说明符时,您是否期望打印相同的结果?我无法想象你为什么会这样做。

标签: c


【解决方案1】:

当您使用 %d 用于像 &my_age 这样的指针来编译代码时,您应该会收到类似于以下内容的警告:

printf.c:10:1: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘int *’ [-Wformat=]

这是因为您使用了错误的格式选项,这会导致未指定的行为。结果取决于架构和实现。换句话说,不可预测。不要那样做。

例如,在我的计算机上,%d 需要一个 4 字节的值,而像 &my_age 这样的地址是一个 8 字节的值。在我的计算机上,这导致 printf 显示指针的最低有效 4 个字节(其 msbit 中有 1,因此被解释为负 4 字节整数)。

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 

int my_age = 24;        
printf("sizeof(my_age)=%d, sizeof(&my_age)=%d\n", sizeof(my_age), sizeof(&my_age));
printf("%d \t %p\n",my_age, &my_age); 
printf("%d \t %d\n",my_age, &my_age); 
}

输出结果:

sizeof(my_age)=4, sizeof(&my_age)=8
24   0x7ffdf27cb52c
24   -226708180

指针的最低有效 4 字节十六进制值是 f27cb52c,解释为十进制 -226708180。

由于具体情况取决于架构,因此您的结果可能会有所不同。 更多详情请参阅帖子here

底线:确保在测试代码之前解决所有警告。

【讨论】:

  • %d 需要 int。这不一定是一个 4 字节的值——它可以而且确实取决于实现。同样,指针也不一定是 8 个字节。这种大小在 64 位系统上很常见,但绝不是必需的。实际大小可能更大或更小。
  • @JohnBollinger:完全同意。我澄清说 4 字节和 8 字节是特定于我的测试台的,其他的里程可能会有所不同。
【解决方案2】:

%p 以十六进制显示地址,

%d 以十进制显示地址

%x 会以十六进制显示

您可以在 ANSI C 中使用的 % 说明符是:

常用变量类型显示

%c char single character
%d (%i) int signed integer
%e (%E) float or double exponential format
%f float or double signed decimal
%g (%G) float or double use %f or %e as required
%o int unsigned octal value
%p pointer address stored in pointer
%s array of char sequence of characters
%u int unsigned decimal
%x (%X) int unsigned hex value

Reference

【讨论】:

  • 唯一的问题是使用除%p 之外的任何指针作为指针都会调用未定义的行为。
  • 要添加到@EugeneSh.:除了UB,intunsigned 可能无法保存所有地址。 %d 期望 ints,%x 期望 unsigned ints。
猜你喜欢
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
相关资源
最近更新 更多