首页 > 解决方案 > 函数参数的地址之间的差异总是 4 个字节吗?

问题描述

我一直在用 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);
}

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

标签: cfunctionpointersparameters

解决方案


绝对不是,在很多方面,很难将它们全部计算在内。

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

va_list存在是因为需要能够导航可变参数列表,因为除此之外没有指定它。 va_list故意非常有限,因此它可以在堆栈形状与您的直觉不匹配的平台上工作。

它不能总是4的其他原因:

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

名单还在继续。C 没有指定参数之间的相对地址。


推荐阅读