计算机如何知道将遵循多少参数?
我们以相反的顺序放置参数
因为有一些printf函数
采用未定义数量的参数。
如果是pritnf,计算机可以知道将遵循多少个参数。
如果格式字符串包含“%s,hello,welcome to%s”,那么只需再阅读2个参数。
但计算机怎么知道什么时候
这样的原型看起来像
int func(int a,int b,...)?
有人可以在集会层面解释我吗?
感谢
答案 0 :(得分:1)
答案是没有。大多数编译器所基于的ANSI C89标准没有定义任何方法来检测指定的参数类型。 printf()起作用,因为它有一个格式字符串,它确切地指定了指定了哪些参数及其类型。您必须以某种方式知道传递的内容并相应地使用stdarg.h中的va_ *宏。 ANSI C89标准草案的第4.8节简单地说,如果您从实际传递的内容中请求不正确的类型或不正确的参数数量,则行为是未定义的。
阅读本文以获取ANSI C89草案中的血腥细节: http://flash-gordon.me.uk/ansi.c.txt
答案 1 :(得分:1)
没有。您可以printf("%d")
,它只会打印它在堆栈中找到的任何内容。 你(程序员)应该知道函数在调用和写入时需要多少个参数。如果您不确定,可以编写具有其他参数数量作为第一个参数的函数
在装配级别,没有任何变化。参数始终位于ebp
之前(它们之前被推过,但它们的地址高于ebp
,因此它们在某种意义上来自ebp + 8
(第一个参数)。如果您知道自己的int func(int a, int b, ...)
需要43个参数,则可以从ebp + 8
到ebp + 0x160
找到它们(假设它们都是int
s)(0x160 = 352dec = 8) + 43 * 4)。
当然,错误的参数数量可能会导致程序崩溃或行为异常(如printf("%s")
)