函数参数地址之间的差异是否总是4个字节?

avi*_*ad1 3 c parameters pointers function

我一直在用C做一些指针测试,但我只是想知道一个函数的参数地址之间是否总是相差4个字节。

我尝试运行以下代码:

#include <stdio.h>

void func(long a, long b);

int main(void)
{
    func(1, 2);

    getchar();
    return 0;
}

void func(long a, long b)
{
    printf("%d\n", (int)&b - (int)&a);
}
Run Code Online (Sandbox Code Playgroud)

这段代码似乎总是显示4,无论func的参数是什么类型。我只是想知道它是否始终为4,因为如果这样,它将对我尝试做的事情很有用(但是如果不一定是4,我想我可以将va_list用于函数或其他东西)。因此:是否一定是4个字节?

Cor*_*ica 6

绝对不是,在很多方面,很难一一列举。

首先,C语言根本不指定参数的内存布局。句号 未指定。因此,答案立即是“否”。

va_list之所以存在,是因为有必要浏览遍历可变参数的列表,因为除此以外没有其他指定。 va_list是故意非常有限的,所以它可以作用于平台,其堆叠的形状不匹配你的直觉。

不能总是4的其他原因:

  • 如果传递长度为8的对象怎么办?
  • 如果编译器优化了引用以实际指向另一帧中的对象该怎么办?
  • 如果编译器增加了填充,也许是为了在64位边界上对齐64位数字,该怎么办?
  • 如果堆栈是沿相反方向构建的(那么差异将是-4而不是+4)怎么办?

清单一直在继续。C没有指定参数之间的相对地址。