c - 传递数组作为参数

标签 c arrays parameters

我想将数组作为参数传递给另一个函数:

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/

相关文章:

c++ - 参数和全局变量,菜单程序

jenkins - 如何从 Jenkins 管道获取所有参数(参数化构建)?

c - 如何根据数据创建Socket

C++源码组织-COM口初始化

c - 如何将文本文件中的该表输入到 C 中?

C51 编译器 - 写入 xdata

mysql - 使用 LabVIEW 和 Workbench 将数组插入 MySQL

c++ - 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?

java - 如何调用字符串数组中的 Java 方法? (java.lang.NoSuchMethodException)

C#:如果传递对象变量,对方法参数使用 ref/out 有什么不同吗?