将数组作为参数传递给C语言

时间:2011-11-16 16:16:26

标签: c arrays parameters

我(我想)我知道如果在堆栈的编译时声明它,你只能检索一个数组的大小(使用sizeof),例如

int my_array[] = {1,2,3};
sizeof(my_array) == 3;

一旦开始使用指针,就会丢失此长度信息。

e.g。如果你将一个指向int的指针作为一个函数参数传递给一个函数,你就不能再以这种方式使用sizeof(),它只会返回用于存储指针的字节数。

显然,知道你的阵列有多长是至关重要的。

那么在传递数组时我应该使用以下哪个选项?

  1. 传递指针和附带的长度参数

    int my_func(int *my_array, size_t len_my_array)

  2. 创建我自己的矢量结构

    struct vector {
       int *my_array;
       size_t len;
    }
    
    int my_func(struct vector *my_vector)
    
  3. 使用别人的矢量实现。 (C是否存在C的默认实现?)

  4. 我错过了另一种方法吗?

  5. (我目前正在使用第一个选项,但它有点笨拙,我很想知道这是否被认为是糟糕的编程习惯)

5 个答案:

答案 0 :(得分:6)

您错过的一种方法是在数组的末尾添加终止元素,类似'\0'标记char*的结尾。

这个并将数组的长度作为一个不同的参数传递是通常的方法。

答案 1 :(得分:4)

标准方法是利用第一种方法并传递指针和大小,特别是如果您希望其他人重用您的代码。

答案 2 :(得分:1)

在我看来,现代C(又名C99)中最简单的方法是使用数组符号

int my_func(size_t len, int my_array[len]);

这几乎和你一样,但是尺寸第一。按此顺序执行此操作的原因是,这可以很好地扩展到多维数组

int my_func(size_t n, size_t m, int my_array[n][m]);

然后您可以在函数内正确获取索引计算,而不会有任何其他困难。

您必须确保的唯一事项

  • 在数组之前的列表中具有大小,因此在声明数组时已知大小
  • 在原型中使用完全相同的声明(尺寸符号等),因为您之后使用了定义,否则会让您的用户感到困惑

答案 3 :(得分:0)

没有被广泛接受的答案,这意味着你可以依赖的唯一方法是第一种。特别是,除非你自己编写所有你的代码(即,永远不使用任何库),否则你几乎可以指望你自己定义的任何vector结构都不同于任何其他人的事实。在代码库之间的“边界”使用,所以在任何情况下你都需要你的第一个方法。他们可能拥有自己内部使用的vector类型。您可能拥有自己在内部使用的一个 - 但是在两者相互交谈的情况下,他们必须将该类型“解包”到其各自的组件中。

答案 4 :(得分:0)

它有点外出,但我刚刚阅读有关数组和指针的内容,您可以考虑使用sizeof来确定字节总数,然后除以数组包含的数据类型的大小(以字节为单位)你的阵列长度......