我有以下程序。我想知道为什么在64位机器上会输出-4?我的哪些假设出了问题?
[Linux ubuntu 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux]
1. 在上述机器和gcc编译器中,默认情况下应该先将b推入栈,然后才是a。栈向下增长。因此,b应该具有更高的地址,而a具有较低的地址。所以结果应该是正数。但我得到了-4。有人能解释一下吗?
2. 参数是两个字符,占用堆栈帧中的2个字节。但我看到的差异是4,而我期望的是1。即使有人说这是由于对齐引起的,我也想知道一个只有2个字符的结构体不会被对齐到4个字节。
[Linux ubuntu 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux]
1. 在上述机器和gcc编译器中,默认情况下应该先将b推入栈,然后才是a。栈向下增长。因此,b应该具有更高的地址,而a具有较低的地址。所以结果应该是正数。但我得到了-4。有人能解释一下吗?
2. 参数是两个字符,占用堆栈帧中的2个字节。但我看到的差异是4,而我期望的是1。即使有人说这是由于对齐引起的,我也想知道一个只有2个字符的结构体不会被对齐到4个字节。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void CompareAddress(char a, char b)
{
printf("Differs=%ld\n", (intptr_t )&b - (intptr_t )&a);
}
int main()
{
CompareAddress('a','b');
return 0;
}
/* Differs= -4 */