一个变量如何在同一时间点有两个不同的地址?
How can a variable have two different addresses at same point of time?
我试着用指针玩弄一些 'i' 的赋值,我发现有两个不同的地址分配给声明 %u 和 %lu,%llu。一个变量怎么可能在同一个执行实例中有两个不同的地址 -
#include <stdio.h>
int main(void)
{
int i;
float f;
printf("\nEnter an integer:\t");
scanf("%d",&i);
printf("\nValue of address of i=%u",&i);
printf("\nvalue of address of i=%d",&i);
printf("\nValue of address of i=%lu",&i);
printf("\nValue of address of i=%llu",&i);
printf("\nvalue of i=%d",i);
printf("\nvalue of i=%u",i);
printf("\nvalue of i=%lu",i);
printf("\nvalue of i=%llu\n",i);
}
这是输出-
aalpanigrahi@aalpanigrahi-HP-Pavilion-g4-Notebook-PC:~/Desktop/Daily programs/pointers$ ./pointer001
Enter an integer: 12
Value of address of i=1193639268
value of address of i=1193639268
Value of address of i=140725797092708
Value of address of i=140725797092708
value of i=12
value of i=12
value of i=12
value of i=12
在这里我们可以清楚地看到 %u 和 %d 的地址是 1193639268(尽管 %d 和 %u 的输出可能不在所有情况下都相等)而 %lu 和 %llu 的输出是 140725797092708它的物理意义是什么
打印指针的正确格式说明符是%p
。
使用错误的格式说明符,例如 %d
、%u
、%lu
或 %llu
调用 undefined behavior.
作为您所看到的特定行为,您的特定实现 上的指针 可能是一个 8 字节值,而 int
或 unsigned int
可能是一个 4 字节的值。因此,使用 %d
或 %u
仅读取传递给函数的 8 字节值的前 4 个字节并打印该值。当您随后使用 %lu
或 %llu
时,所有 8 个字节都将被读取并打印出来。
同样,因为您正在调用未定义的行为,所以您不能依赖于此特定输出的一致性。例如,在 32 位模式和 64 位模式下编译可能会产生不同的结果。最好使用 %p
,并将指针转换为 void *
,因为这是 %p
.
期望的特定指针类型
没有。只是您对指针类型使用了不正确的格式说明符。
这样做的行为是未定义的。您观察到的输出是该未定义行为的表现。
将 %p 用作指针,并将指针参数转换为 const void* 类型(许多编译器在最后一点上很松懈,但这仍然是一个好习惯)。
您使用了错误的格式说明符,导致 undefined behavior。在这种特定情况下,行为是 1193639268 (0x47257D64
) 是 140725797092708 (0x7FFD47257D64
)
的下半部分
地址的正确格式说明符是%p
只有一个地址。您正在使用不同宽度的整数打印代码,因此有时您会看到 32 位地址,有时您会看到 64 位地址。多少有效取决于您的系统;在 32 位系统上,打印 64 位意味着 32 位的值是垃圾;在 64 位系统上,打印 32 位意味着您省略了一半的指针。
有专门的格式代码,%p
用于打印指针,请使用它,而不是整数打印代码。
我试着用指针玩弄一些 'i' 的赋值,我发现有两个不同的地址分配给声明 %u 和 %lu,%llu。一个变量怎么可能在同一个执行实例中有两个不同的地址 -
#include <stdio.h>
int main(void)
{
int i;
float f;
printf("\nEnter an integer:\t");
scanf("%d",&i);
printf("\nValue of address of i=%u",&i);
printf("\nvalue of address of i=%d",&i);
printf("\nValue of address of i=%lu",&i);
printf("\nValue of address of i=%llu",&i);
printf("\nvalue of i=%d",i);
printf("\nvalue of i=%u",i);
printf("\nvalue of i=%lu",i);
printf("\nvalue of i=%llu\n",i);
}
这是输出-
aalpanigrahi@aalpanigrahi-HP-Pavilion-g4-Notebook-PC:~/Desktop/Daily programs/pointers$ ./pointer001
Enter an integer: 12
Value of address of i=1193639268
value of address of i=1193639268
Value of address of i=140725797092708
Value of address of i=140725797092708
value of i=12
value of i=12
value of i=12
value of i=12
在这里我们可以清楚地看到 %u 和 %d 的地址是 1193639268(尽管 %d 和 %u 的输出可能不在所有情况下都相等)而 %lu 和 %llu 的输出是 140725797092708它的物理意义是什么
打印指针的正确格式说明符是%p
。
使用错误的格式说明符,例如 %d
、%u
、%lu
或 %llu
调用 undefined behavior.
作为您所看到的特定行为,您的特定实现 上的指针 可能是一个 8 字节值,而 int
或 unsigned int
可能是一个 4 字节的值。因此,使用 %d
或 %u
仅读取传递给函数的 8 字节值的前 4 个字节并打印该值。当您随后使用 %lu
或 %llu
时,所有 8 个字节都将被读取并打印出来。
同样,因为您正在调用未定义的行为,所以您不能依赖于此特定输出的一致性。例如,在 32 位模式和 64 位模式下编译可能会产生不同的结果。最好使用 %p
,并将指针转换为 void *
,因为这是 %p
.
没有。只是您对指针类型使用了不正确的格式说明符。
这样做的行为是未定义的。您观察到的输出是该未定义行为的表现。
将 %p 用作指针,并将指针参数转换为 const void* 类型(许多编译器在最后一点上很松懈,但这仍然是一个好习惯)。
您使用了错误的格式说明符,导致 undefined behavior。在这种特定情况下,行为是 1193639268 (0x47257D64
) 是 140725797092708 (0x7FFD47257D64
)
地址的正确格式说明符是%p
只有一个地址。您正在使用不同宽度的整数打印代码,因此有时您会看到 32 位地址,有时您会看到 64 位地址。多少有效取决于您的系统;在 32 位系统上,打印 64 位意味着 32 位的值是垃圾;在 64 位系统上,打印 32 位意味着您省略了一半的指针。
有专门的格式代码,%p
用于打印指针,请使用它,而不是整数打印代码。