gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:56:31 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

不能总是 4 的其他原因:

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

这个 list 还在继续。 C 不指定参数之间的相对地址。

关于c - 函数参数地址之间的差异是否总是 4 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57084488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com