【发布时间】:2012-06-19 02:23:16
【问题描述】:
我有以下程序。我想知道为什么它在下面的 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]
在上述机器和 gcc 编译器中,默认情况下应该先推送 b,然后再推送。 堆栈向下增长。所以 b 应该有更高的地址,而 a 应该有更低的地址。所以结果应该是积极的。但我得到-4。谁能解释一下?
参数是两个字符,占用堆栈帧中的 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 */
【问题讨论】: