在C中,如何将未知大小的数组传递给函数(通过引用)?
数组的大小仅在函数内部确定。
你必须在函数内部使用malloc
数组。然后:
[给出int数组的例子;相应调整]
(i)返回指向它的指针:
int* f(void) {
int *array;
.
.
.
array = malloc(length * sizeof int);
.
.
.
return array;
}
要么
(ii)将其存储在调用者传递的指针内
void f(int **array) { // yes, double pointer
.
.
.
*array = malloc(length * sizeof int); // here malloc's your array and store it in *array
.
.
.
}
完成后,不要忘记free
这个数组。
编辑:被调用者将是:
(一世)
int *array; // can't use the array yet
.
.
.
array = f(); // now it's available for use
.
.
.
free(array); // no longer available
(二)
int *array; // can't use the array yet
.
.
.
f(&array); // now it's available for use
.
.
.
free(array); // no longer available
如果数组是空终止字符数组,那么您可以使用strlen
来计算该字符数组的长度。否则,您需要使用分隔符来知道数组的末尾,并使用循环来定位分隔符。
注意:C中没有通过引用传递。
您必须传递数组的起始地址以及参数的数量,如下所示。
void f (int* array, int n) {
int i, x;
for (i = 0; i < n; i++) {
x = array[i]; // use x
...
}
...
}
替代方案:您必须就标准EOD(数据结束)标记达成一致。在这种情况下,您可能不会显式传递数组的长度,而是依赖该值来检查数组的结尾。一个例子是0终止的字符串(C的char数组)。
#define END_OF_ARRAY -1
void f (int* array) {
int i;
while (array[i] != END_OF_ARRAY) {
// use array[i]
...
i++;
}
...
}