Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如果varargs都是同一类型的指针,是否可以将其解释为数组?_C_Variadic Functions - Fatal编程技术网

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。