【发布时间】:2010-09-09 14:29:39
【问题描述】:
这种情况只有在没有名字修饰的情况下才会发生(我相信),所以下面的代码是 C。 假设在 A.c 中有一个函数 A 定义为
void A(int x, int y){
//Do stuff
}
现在还有一个单独的文件 B.c:
extern "C"{
void A(int x, int y, int z);
}
void B(){
A(1, 2, 3);
}
A 最初被声明为只有 2 个参数,但是当在 B.c 中声明时它有一个额外的参数,并且在 B() 中使用第三个参数调用它。 我知道有可能发生这种情况,例如在与 fortran 子例程链接时,或者在动态链接时。
我想将额外的参数传递给函数是不安全的,谁能解释当调用函数并将参数传递给它时内存中发生了什么?因此,传递这个既不使用也不想要的“额外”参数是多么安全。
额外的参数是否有可能覆盖函数中使用的内存空间?还是对 A 的函数调用为参数分配内存空间,然后告诉 A 参数内存块的开头在哪里,A 读取前两个参数并忽略最后一个参数,使其完全安全?
任何有关该功能的信息都会非常有启发性,谢谢。
【问题讨论】:
-
请注意,这里的几乎每个答案都假设 x86 ——在几个平台上,这永远不会有效。它完全取决于平台和调用约定。
标签: c linker fortran dynamic-linking