C 变量的内存地址之间的差异是恒定的

C 变量的内存地址之间的差异是恒定的,c,pointers,memory,int,memory-address,C,Pointers,Memory,Int,Memory Address,我运行了以下代码,这是我得到的输出: #include <stdio.h> int main() { int x = 3; int y = x; printf("%d\n", &x); printf("%d\n", &y); getchar(); return 0; } Output: 3078020 3078008 #包括 int main() { int x=3; int y=x; printf(“%d\n”

我运行了以下代码,这是我得到的输出:

#include <stdio.h>

int main()
{
    int x = 3;
    int y = x;
    printf("%d\n", &x);
    printf("%d\n", &y);
    getchar();
    return 0;
}

Output:

3078020
3078008
#包括
int main()
{
int x=3;
int y=x;
printf(“%d\n”、&x);
printf(“%d\n”、&y);
getchar();
返回0;
}
输出:
3078020
3078008
现在,每次我运行程序时,输出都会改变,但是x的位置和y的位置之间的差值总是12。我想知道为什么

编辑:我理解为什么差异是恒定的。我不明白的是,为什么差别是12,为什么后面定义的y的内存地址小于x。

在代码中

printf("%d\n", &x);
不是打印指针值的正确方法。你需要的是

printf("%p\n", (void *)&x);
也就是说,地址之间的差异是恒定的,因为这两个变量通常放在堆栈中连续的内存位置。然而,在
c
标准中,这并没有得到保证。唯一需要保证的是
sizeof(a)
[数据类型的大小]将针对特定平台进行固定。

在您的代码中

printf("%d\n", &x);
不是打印指针值的正确方法。你需要的是

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

也就是说,地址之间的差异是恒定的,因为这两个变量通常放在堆栈中连续的内存位置。然而,在
c
标准中,这并没有得到保证。唯一需要说明的是
sizeof(a)
[数据类型的大小]对于特定平台是固定的。

要打印变量的地址,必须使用
%p
而不是
%d

printf("%d\n",x);// It will print the value of x
printf("%p\n",(void*)&x);// It will print the address of x.
要仅打印整数值,您必须给出
%d

printf("%d\n",x);// It will print the value of x
printf("%p\n",(void*)&x);// It will print the address of x.
printf的手册页

p      The void * pointer argument is printed in hexadecimal

要打印变量的地址,必须使用
%p
而不是
%d

printf("%d\n",x);// It will print the value of x
printf("%p\n",(void*)&x);// It will print the address of x.
要仅打印整数值,您必须给出
%d

printf("%d\n",x);// It will print the value of x
printf("%p\n",(void*)&x);// It will print the address of x.
printf的手册页

p      The void * pointer argument is printed in hexadecimal

由于(ASLR)等保护措施,地址本身可能会发生变化

<>这是为了减轻代码攻击向量的可能性。如果总是在同一个地址加载,则更有可能进行成功的攻击

通过在每次加载时移动地址,攻击在任何地方(实际上是在任何地方)都会变得更加困难


但是,两个变量都将在一个堆栈帧中的堆栈上(假设实现甚至使用了一个无法保证的堆栈),它们之间的差异不大可能改变。

由于(ASLR)等保护措施,地址本身可能会改变

<>这是为了减轻代码攻击向量的可能性。如果总是在同一个地址加载,则更有可能进行成功的攻击

通过在每次加载时移动地址,攻击在任何地方(实际上是在任何地方)都会变得更加困难


然而,事实上,这两个变量都将在一个堆栈框架中的堆栈上(假设实现甚至使用了一个无法保证的堆栈),它们之间的差异不大可能改变。

@paxdiablo先生,我说的c标准中没有保证这一点是对的吗?是的,我非常肯定这是对的。例如,指针值在结构或数组中受到某些限制,但不同的变量不需要按任何特定顺序排列。@paxdiablo感谢您的审阅。:-)从技术上讲,不同变量之间的指针算法是未定义的,但实际上通常是可预测的。@paxdiablo先生,我说c标准中没有保证这一点是对的吗?是的,我非常肯定这是对的。例如,指针值在结构或数组中受到某些限制,但不同的变量不需要按任何特定顺序排列。@paxdiablo感谢您的审阅。:-)从技术上讲,不同变量之间的指针算法是未定义的,但实际上通常是可预测的。感谢您第次给出了一个很好的答案。:-)为什么特别是12点?感谢您第次给我一个很好的回答。:-)为什么是12号?