C 如果varargs都是同一类型的指针,是否可以将其解释为数组?
如果您有C 如果varargs都是同一类型的指针,是否可以将其解释为数组?,c,variadic-functions,C,Variadic Functions,如果您有int foo(a_type first,…),其中vararg都是const char*(或其他一些指针类型),您可以从first(或通过终止NULL指针)确定它们的数量,您是否可以将此结构解释为数组(const char**)无需malloc实际数组并将指针复制到其中?参数是否应该在堆栈上正确对齐,就像它们在数组中的位置一样?这是可移植的还是参数的顺序可以不同 编辑:为了澄清,我不打算在生产代码中使用类似的东西。我只是好奇而已。你也许能侥幸逃脱。有一段时间 问题是,在C语言中,您可以
int foo(a_type first,…)
,其中vararg都是const char*
(或其他一些指针类型),您可以从first
(或通过终止NULL
指针)确定它们的数量,您是否可以将此结构解释为数组(const char**
)无需malloc
实际数组并将指针复制到其中?参数是否应该在堆栈上正确对齐,就像它们在数组中的位置一样?这是可移植的还是参数的顺序可以不同
编辑:为了澄清,我不打算在生产代码中使用类似的东西。我只是好奇而已。你也许能侥幸逃脱。有一段时间 问题是,在C语言中,您可以在未定义的行为中处理很多事情,但这并不能使它们正确
您的想法的一个问题是,C不需要计算机有任何称为“堆栈”的东西,也不需要在上面放置函数参数。它们不需要在任何特定的位置或订单上。不,它不会是便携式的。就语言标准而言,必须使用varargs函数和宏来访问变量参数,这是无法避免的。no;不能保证变量参数列表是连续排列的,因此不能假设值的排列方式与数组中的一样。必须使用
va.*
宏在列表中前进 数组不是指针(如“constchar**
”)。如果你不能理解这个简单的事实,你可能不应该试图将任何特定的布局归因于varargs参数。@KerrekSB你在胡扯什么?在C语言中,数组是元素类型大小的倍数的内存区域。数组本身作为指向函数的指针传递,在任何情况下都可以通过指针引用。为什么我需要解释呢?不要强迫varargs使用堆栈(而不是通过寄存器调用)?但是是的,这只是一个粗俗的想法。不太严重。@panzi:C是非常通用的。它不需要计算机有一个堆栈或寄存器来实现C。