gpt4 book ai didi

c - 请解释程序是如何工作的

转载 作者:太空狗 更新时间:2023-10-29 17:05:16 25 4
gpt4 key购买 nike

#include<stdio.h>
int f();

int main()
{

f(1);
f(1,2);
f(1,2,3);
}

f(int i,int j,int k)
{

printf("%d %d %d",i,j,k);

}

它运行良好(没有任何错误)...你能解释一下它是如何执行的吗?f(1) 和 f(1,2) 如何链接到 f(int,int,int)?

最佳答案

您对“错误”的定义一定与我不同 :-) 您调用 f 函数前两次打印的是什么?我明白了

1 -1216175936 134513787
1 2 134513787
1 2 3

我的三个函数调用。

您看到的是早期 C 语言的遗留问题,当时人们可以自由自在地进行函数调用。

所有发生的事情是您正在调用一个函数 f 并且它从堆栈中打印出三个值(是的,即使您只给它一个或两个)。如果您没有提供足够的数据,您的程序很可能只会使用现有的数据,这通常会导致读取时出现数据问题,写入时出现灾难性故障。

这是完全可编译的,尽管非常不明智,C。我的意思是在一个非常真实的“未定义行为”中,这个词的意义(具体指 C99:“如果表示被调用函数的表达式具有类型不包含原型(prototype),...如果参数的数量不等于参数的数量,则行为未定义”)。

您确实应该提供完整的函数原型(prototype),例如:

void f(int,int,int);

为确保您的编译器能够识别此问题,并在可变参数函数中使用省略号 (...)。


顺便说一句,通常在幕后发生的是调用函数以堆栈开头,如下所示:

12345678
11111111

并将(例如)两个值压入堆栈,这样它最终会像这样:

12345678
11111111
2
1

当被调用函数使用堆栈上的前三个值时(因为这是它想要的),它发现它有 1211111111

它执行必须执行的操作然后返回,并且调用函数从堆栈中清除这两个值(这称为调用者做好策略)。不幸的是,任何尝试使用被调用方做出好的策略的人都会有祸了:-) 尽管这在 C 中很不寻常,因为它使得像 printf 这样的可变参数函数有点难以实现。

关于c - 请解释程序是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3177539/

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