如何在不知道大小的情况下遍历数组

how to iterate through an array without knowing the size in c

我有一个指向 C 中数组的指针,我想遍历它,但我不知道它的大小:

int *array;

我不确定我应该如何进行。我在想我应该尝试通过以下方式找到尺寸:

int array_size = sizeof(array) / sizeof(int);

但我不知道这是否可行。我想知道是否有更好的方法来做到这一点?

你不能在不知道元素数量的情况下迭代 C 中的数组。

请注意 sizeof(array) / sizeof(array[0]) 不适用于指针,即它不会给出数组中元素的数量。

它也不会在函数内部工作,在函数中由于数组衰减为指针而将数组作为参数传递。

如果数组不包含已知的标记值(例如,包含字符串的字符数组将终止零字符作为标记值'[=12=]'),那么您将找不到它的结尾。

如果你有这样的指针

int *array;

那么表达式 sizeof( array ) 将产生指针本身的大小,它不依赖于指针是指向类型 int 的单个对象还是指向整数的第一个元素数组中元素数量已知的数组。例如,该大小可以等于 48,具体取决于所使用的系统。因此表达式 sizeof( array ) / sizeof( int ) 通常总是会产生 12.

因此您还必须明确地将数组中元素的数量传递给函数。

如果将指针传递给整个数组,则可以确定数组中元素的数量。例如

void f( int( *a )[10] );

//...

int a[10];

//...

f( &a );

在这种情况下,取消引用函数内的指针,您将获得一个数组类型的对象。因此表达式 sizeof( *a ) 将产生原始数组的大小。

在 C 中,无法通过指向元素的指针来判断数组中元素的数量。 sizeof(array) / sizeof(*array) 仅适用于实际数组,不适用于指针,指针是函数接收的参数,即使函数原型中使用了数组语法。在这种情况下,sizeof(array) 的计算结果为指针的大小,因此将其除以元素的大小是没有意义的。

函数获取元素数量的最佳方法是将其作为单独的参数提供。

如果这不切实际,有不同的方法可以推断元素的数量,这取决于调用者必须遵守的约定:

  • 数组可以有已知固定数量的元素

  • 数组可以将标记值作为数组的最后一个元素。

    通常使用空指针 (NULL) 作为指针数组的标记,例如 main() 函数的 char *argv[] 参数,但请注意int argc也提供了这个功能。

    空字节([=16=])用于告诉C字符串的结尾,它是char的数组。

    在您的情况下,您可以考虑使用 0-1 来表示数组的结尾,但函数的所有调用者都必须一致地使用此约定。

I have a pointer to an array in c to which I would like to iterate through but I don't know the size:

如果你真的有一个指向数组的指针,你就走运了,因为指向数组的指针的类型包含关于数组大小。

  int some_array[7] = {1, 2, 3, 4, 5, 6, 7};
  int (*pointer_to_an_array)[7] = &some_array;

  #define N (sizeof(*pointer_to_an_array) / sizeof(*pointer_to_an_array[0]))
  for (size_t i = 0; i < N; i++) {
    printf("%d\n", (*pointer_to_an_array)[i]);
  }

  

不幸的是,对于 int *array;,代码没有 指向数组的指针 ,而是指向 int 的指针和有关原始数组的信息some_array[] 的尺寸无法通过 array 获得。

int some_array[7] = {1,2,3,4,5,6,7};
int *array = some_array; // Not a pointer to an array

在另一个变量中携带有关数组大小的信息。

size_t some_array_n = sizeof some_array/ sizeof some_array[0];