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

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

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

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

例如,如果将指向int的指针作为函数参数传递以将int数组转换为函数,则不能再以这种方式使用sizeof() ,它将只返回用于存储指针的字节数。

显然,了解arrays的长度至关重要。

因此,在传递数组时,我应该使用以下哪个选项?

  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. 我错过了另一种方法吗?

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

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

你错过的一种方法是在数组的末尾放置一个终止元素,有点像'\0'标记char*的结尾。

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

在我看来,现代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]); 

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

你唯一需要确保的事情

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

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

它有点在那里,但我刚刚阅读有关数组和指针的内容,您可以考虑使用sizeof来确定总字节数,然后除以数组包含的数据类型的字节大小,以便为您提供数组长度…