为什么两个指针的地址是连续的?

时间:2014-09-16 18:49:10

标签: c

#include<stdio.h>
int main()
{
    unsigned int * p,*q; 

    printf("%u,%u\n",&p,&q);    
    return 0;
}

上述代码的输出为3218088104,3218088108。由于指针有随机地址,为什么它们很有意义呢?

3 个答案:

答案 0 :(得分:5)

您已经分配了编译器决定放在堆栈上的两个对象。它们恰好在堆栈上彼此相邻。因此,他们有连续的地址。

您可以通过执行以下操作来查看这两个变量的

printf("%p %p\n", (void *) p, (void *) q);

但这些值不是随机的,它们只是未指定

需要注意的其他事项: 使用%u打印类型unsigned int **的值是未定义的行为。正确的代码是强制转换为void *并使用格式说明符%p

答案 1 :(得分:3)

您正在输出指针的地址,它们是在堆栈上背靠背创建的。如果你从printf调用中删除&,那么你将打印指针的,它们将是未初始化的堆栈空间,可以是任何东西。

答案 2 :(得分:1)

也许困惑在于无法保证你的程序在内存中的位置会被加载,所以即使它们在内存中是连续的,它们也可能在地址2686748和2686744或3218088104,3218088108或其他任何地方。在这个意义上,它可以被认为是“随机的”。虽然这不是考虑它的最佳方式。