gpt4 book ai didi

c - 将 "too many"参数传递给外部函数是否安全?

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

这种情况只有在没有名称修改的情况下才会发生(我相信),所以下面的代码是 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 读出前两个参数并忽略最后一个,使其完全安全?

有关该功能的任何信息都会很有启发性,谢谢。

最佳答案

链接是实现定义的,所以没有办法确定。

也就是说,C 的其他特性(特别是 vardic 参数)强制执行通常允许它的实现。

例如,如果您这样写,我不知道有任何实现会失败:

 printf("%d", 1, 2);

然而,它只会打印“1”。

这里很多人提出了cdeclpascal__stdcall 调用约定。但是,这些都不是标准的一部分,并且都是某些实现的特性。这让我们回到我的第一句话。

关于c - 将 "too many"参数传递给外部函数是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3677542/

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