我想将数组作为参数传递给另一个函数:
int i;
int main()
{
int a[5] = {1, 2, 3, 4, 5};
printf("Main:\n");
for(i=0; i<sizeof(a)/sizeof(int); i++)
{
printf("%i\n", a[i]);
}
func(a);
return;
}
void func(int a[])
{
printf("Func:\n");
for(i=0; i<sizeof(a)/sizeof(int); i++)
{
printf("%i\n", a[i]);
}
}
main
函数中的循环打印所有 5 个值:
Main:
1
2
3
4
5
但是函数 func
中的循环只打印 2 个值:
Func:
1
2
为什么会出现这种奇怪的行为?
最佳答案
I want to pass an array as a parameter to another function:
这是一个常见的陷阱。 数组不带长度,就像在其他语言中一样。 C“数组”只是一堆连续的值,因此 sizeof
不会(必然)返回数组的长度。
实际发生的是,函数被传递了一个指针到存储数组的内存区域(因此,传递到数组的第一个元素),但没有关于该区域的信息尺寸。要“传递具有大小的数组”,您必须做一些事情来提供额外的信息:
显式传递也它的长度作为额外参数。更安全:您可以传递未初始化的数组。
在数组上使用一个特殊的“终止”值。更紧凑:您只传递一个参数,即指向数组的指针。
(@CisNOTthatGOODbutISOisTHATBAD 的评论隐式建议):将指针传递给
struct
,其中包含指向内存的指针和元素中的size_t
长度(或在字节)。这样做的好处是可以存储更多关于阵列的元数据。
对于整型数组,您甚至可以将长度存储在数组的第一个(第零个)元素中。当从具有从 1 开始的“测量”数组和索引的语言移植时,这有时会很有用。在所有其他情况下,请使用方法 #1。更快、更安全,而且在我看来更清晰。
字符串是使用方法#2 变体的字符数组:它们以特殊值(零)结束。
使用方法#1,您的函数将变为:
void func(size_t n, int a[])
{
printf("Func:\n");
for (i=0; i < n; i++)
{
printf("%i\n", a[i]);
}
}
(它等同于 void func(size_t n, int *a)
)。
关于c - 传递数组作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20036549/