#include<stdio.h>
int main()
{
unsigned int * p,*q;
printf("%u,%u\n",&p,&q);
return 0;
}
上述代码的输出为3218088104,3218088108
。由于指针有随机地址,为什么它们很有意义呢?
答案 0 :(得分:5)
您已经分配了编译器决定放在堆栈上的两个对象。它们恰好在堆栈上彼此相邻。因此,他们有连续的地址。
您可以通过执行以下操作来查看这两个变量的值:
printf("%p %p\n", (void *) p, (void *) q);
但这些值不是随机的,它们只是未指定。
需要注意的其他事项: 使用%u
打印类型unsigned int **
的值是未定义的行为。正确的代码是强制转换为void *
并使用格式说明符%p
。
答案 1 :(得分:3)
您正在输出指针的地址,它们是在堆栈上背靠背创建的。如果你从printf调用中删除&
,那么你将打印指针的值,它们将是未初始化的堆栈空间,可以是任何东西。
答案 2 :(得分:1)
也许困惑在于无法保证你的程序在内存中的位置会被加载,所以即使它们在内存中是连续的,它们也可能在地址2686748和2686744或3218088104,3218088108或其他任何地方。在这个意义上,它可以被认为是“随机的”。虽然这不是考虑它的最佳方式。