1

在 sizeof 参数的帮助下创建数组后,我知道如何检测数组的大小:

int arr[10];
printf("%i",sizeof(arr)/sizeof(int));

但据我了解,当我将数组作为参数传递给函数时,我实际上是传递了一个指向数组第一个元素的指针,而不是实际的数组。因此,如果我将使用 sizeof 运算符,我将获得指针的大小。

我知道我可以通过搜索 '\0' 找到一个字符串(字符数组)的大小。所以让我们假设我们正在谈论 int 数组;

如何检测作为参数传递的数组的大小?

4

7 回答 7

3

像往常一样,当被问到这个问题时,会出现很多答案,说您必须将元素的数量作为参数传递给函数。

这当然是不正确的。如果函数需要知道数组中元素的数量,则必须向函数提供信息,但可以通过多种方式提供。这最简单地通过一个参数,但它可能是通过零个或多个参数的任意组合、全局状态、由参数或全局状态直接或间接指向的信息、从先前函数调用中记住的静态信息、数组本身的某些质量(例如哨兵),编译时常量或几乎任何其他可以想象的方式,并且该数字可能明确存在于上述任何内容中,或者可能是从信息中计算或推导出来的。

您无法获取数组中元素数量的唯一方法是通过应用于传递的指针的标准 C 机制。

于 2013-04-08T16:08:24.867 回答
1

你不能,你必须将尺寸作为附加参数发送给函数。

于 2013-04-08T16:01:27.000 回答
1

你不能。在 C 中,当您将数组传递给函数时,就decays函数的作用域而言,它从数组传递给指向类型的指针。

所以,考虑一下:

int arr[16];
sizeof(arr);          // sizeof WORKS
myFunction(arr);      // Array decays to pointer, sizeof FAILS inside function
myFunction(&arr[0]);  // Array decays to pointer, sizeof FAILS inside function

void myFunction(int* ptr)
{
  // sizeof(ptr) will not give you what you would expect normally
}

在 C 中执行此操作的传统方法是有一个额外的函数参数,即:

void myFunction(int* ptr, size_t mySize)
{
}

或者,创建自己的结构来保存指向数组的指针及其大小,即:

typedef struct myType {
  int*   ptrToArray;
  size_t arraySize;
} myType_t;

int array[16] = { 0 };
myType_t data;
data.ptrToArray = array;
data.arraySize = 16;

void myFunction(myType_t data)
{
}
于 2013-04-08T16:24:41.333 回答
0

您可以NULL通过每次递增一个变量来终止数组并循环,直到它达到NULL这将为您提供大小。

int arr[10] = {1, 2, 3, 4, 5, NULL}

或类似的东西。在您的情况下,您可能必须写入NULL当前索引 + 1。其他选项(例如创建struct保持大小的 a)可能会更好,因为它们的成本更低。

于 2013-04-08T17:11:30.133 回答
0

与您可能期望的相反,以下程序以代码退出1(也是@K Scott Piel)

int f(int a[10])
{
        return sizeof(a)/sizeof(int);
}

int main(void)
{
        int     a[10];
        return f(a);
}

这确实是其他几个人提到的:因为 C 中的参数数组只是一个指针。你可以检查你的编译器,也许它有绕过它的扩展,但它会使你的代码不可移植。

解决它的一种方法是将数组包装在struct. 以下程序确实以代码 10 退出。

typedef struct { int a[10]; } a10;
int f(a10 a)
{
        return sizeof(a)/sizeof(int);
}

int main(void)
{
        a10     a;
        return f(a);
}

不过,要了解这些元素有点麻烦。如果你想支持不同大小的数组,你必须自己编程(正如其他人指出的那样)。请注意,它sizeof是在编译时计算的,并且就编译器而言是一个常量。它只能因平台而异。

哦,请注意,第二个示例中的数组是按值传递的,而在第一个示例中它是通过引用传递的。

于 2013-04-08T17:19:48.960 回答
0

您需要将其作为参数传递给函数。或者您需要声明要作为固定传递的数组的大小...

void myFunc( int* array, size_t numElements );

或者如果数组的大小是已知常数

void myFunc( int array[10] );

或任何其他使数组大小可用于函数的无数方法(全局变量等)。通过指针检测数组的大小不是 C 的内置函数。

于 2013-04-08T16:02:02.470 回答
0

通过以空值结尾的数组,或通过传入元素的数量。在 C 中,无法判断数组中包含多少元素。

于 2013-04-08T16:01:33.210 回答