c - 函数参数的地址之间的差异总是 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个字节吗?
解决方案
绝对不是,在很多方面,很难将它们全部计算在内。
首先,C 语言根本没有指定参数的内存布局。句号。未指定。因此,答案立即是“不”。
va_list
存在是因为需要能够导航可变参数列表,因为除此之外没有指定它。 va_list
故意非常有限,因此它可以在堆栈形状与您的直觉不匹配的平台上工作。
它不能总是4的其他原因:
- 如果你传递一个长度为 8 的对象怎么办?
- 如果编译器优化引用以实际指向另一帧中的对象怎么办?
- 如果编译器添加填充,可能是为了在 64 位边界上对齐 64 位数字怎么办?
- 如果堆栈以相反的方向构建(这样差异将是 -4 而不是 +4)怎么办?
名单还在继续。C 没有指定参数之间的相对地址。
推荐阅读
- deployment - 我在使用 hwc buildpack 时收到错误消息。我的应用程序使用 .net 框架 4.6.1
- regex - CloudWatch Insights - 按删除唯一 ID 的 url 对日志进行分组
- datetime - 我们可以在 dart/flutter 中格式化没有 Intl Package 的 DateTime 吗?
- go - 为什么会有这样的结果?
- css - 对其他样式组件的引用不起作用
- java - 如何让 IntelliJ 使用它构建的 Maven 配置文件运行 Spring Boot 应用程序?
- javascript - react.js npm包无法解析
- javascript - 执行不会超过第二次 fetch 调用(与 Gatsby 相关的东西)
- python-3.x - 以固定大小保存绘图
- r - 在 ggplot2 中向 DotPlot 添加均值和胡须