【发布时间】:2019-01-18 20:10:17
【问题描述】:
我正在学习指针并尝试使用它! 这是我的代码..
#include<stdio.h>
int main() {
int a[2]={1,2};
int* p=a;
int* q=&a;
int *r=&a[0];
printf("%d %d %d",p,q,r);
return 0;
}
代码的输出是:
-20578720 -20578720 -20578720
现在当我将 q 更改为 integer variable 时,地址不是负数:
#include<stdio.h>
int main() {
int a[2]={1,2};
int* p=a;
int q =*a;//this is the change
int *r=&a[0];
printf("%d %d %d",p,q,r);
return 0;
}
现在输出:
1822271664 1 1822271664
我尝试在网上搜索并找到了这个memory address positive or negative value in c? 它告诉我要使用 %p,我做到了,我得到了 正十六进制地址值:
0x7ffc4b5dbb90 0x7ffc4b5dbb90 0x7ffc4b5dbb90
现在我有正确答案但不知道
- 为什么 %p 有效,而 %d 和 无效
- 为什么在使 q 整数之后,地址是 正。
对于第一个我得到了这个但我无法理解答案:Difference between %d and %p printf format string directives in c language?
【问题讨论】:
-
请正确格式化您的代码
-
简单来说,用指针使用
%d是不正确的,会调用undefined behavior。因此,您的问题在技术上毫无意义:任何事情都可能在您的两个程序中发生。 -
%d 是一个 32 位有符号整数,这就是您要求打印地址的方式。 %u 是一个 32 位无符号整数。您也可以尝试打印一个 64 位整数,有符号或无符号。这是你的家庭作业,完成后回复我。
-
@TheGreatContini
"%d"代表int。int位宽在这里并不重要。 -
很有可能,在您的 C 实现中,指针是 8 个字节,
int是 4 个字节。当您使用%d错误地打印指针时,恰好指针的低四个字节用于int。 (这只是发生的事情,而不是您可以依赖的行为。)低四个字节是变化最大的,系统会改变程序布局以使恶意软件更难攻击。所以他们在int的“符号位”上有所不同。
标签: c