|
1
7
在x86-64 Linux上,每个32位参数在单独的64位寄存器中传递 (因为这正是x86-64 System V调用约定所要求的)。 调用方碰巧有零将32位参数扩展到64位寄存器中。(这不是必需的;程序中未定义的行为可能会让另一个调用者在arg传递寄存器中留下高垃圾。)
被叫方(
在32位ARM上,
被叫方看到的第一个64位参数可能是
(请注意,这可能会导致调用方在堆栈上的局部变量损坏,因为被调用方被允许删除堆栈参数。)
有关完整的详细信息,请使用编译器+编译选项查看代码的asm输出,以了解源代码中的C未定义行为到底导致了什么行为。
|
|
|
2
1
在我的系统上(x86\u 64)
这印的是8,这告诉我
无论您的
也不要申报您的
这是不可移植的,因为
因此,您的程序应该如下所示:
这是可移植的,在不同的 架构。 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
MysteryMoose · GCC下故意忽略初始化器警告中的过量元素 1 年前 |
|
|
Ken P · 如何利用[*]printf格式类型规范警告? 2 年前 |
|
fghoussen · 在C结构体中,为什么打包、对齐似乎会进行填充? 2 年前 |
|
|
adversarr · 全局变量何时导出到可执行文件? 2 年前 |