2

我在 C 中有一个函数(我使用的是 gcc 4.8.0),它接收一个数组作为它的参数。有没有一种方法可以准确地确定数组中的元素数量,而无需传递额外的参数 array_count?

4

6 回答 6

4

通常无法确定作为参数传递的数组元素的数量。

当您在 C 中将数组作为参数传递时,您只传递指向该数组的指针,即指向包含该数组的存储区的第一个元素(索引为 0)的指针。

很多时候,程序员的约定是传递数组的大小作为另一个参数。例如,标准qsort(3)库函数期望数组中要排序的元素数作为其第二个nmemb参数。

或者,您可以使用灵活的数组成员,例如传递(在 C99 中,而不是在早期的 C 标准中)结构的地址,如

struct my_flexarray_st {
   int size; // allocated size
   int len;  // used length, should be less than size
   double arr[]; /// only len numbers are meaningful
};

无论您使用哪种方法,您都需要了解数组大小通常由函数在通过参数传递时知道。因此,请记录该约定。你甚至可以有一个(坏的)约定,即所有数组都有一些全局变量作为它们的维度。

对于堆分配的内存区域,标准为您malloccalloc朋友提供了这样的新区域,但无法查询其分配的大小。一些 C 库具有非标准扩展来查询(但我不建议使用它们)。

在最近的C++11(与C语言不同)中,您可能会对std::vectorstd::array模板容器感兴趣。

于 2013-10-05T13:18:39.630 回答
3

数组衰减为函数参数中的指针,因此无法确定大小。

出现在表达式中的 T 数组类型的左值 [参见问题 2.5 ] 衰减(除了三个例外)成指向其第一个元素的指针;结果指针的类型是指向 T 的指针,因为数组不是“可修改的左值”

(例外情况是数组是 sizeof 或 & 运算符的操作数,或者是字符数组的文字字符串初始值设定项。)

于 2013-10-05T13:20:40.590 回答
1

你不能,除非数组是静态的(即不是动态分配的),那么你可以使用sizeof运算符。

于 2013-10-05T13:19:34.233 回答
0

这在 C 中是可行的。如果您在其定义的同一范围内,则可以通过 sizeof 查询数组的大小。如果您在将数组作为参数的函数范围内,则需要将参数声明为指向数组的指针(不仅仅是数组 - 在这种情况下,数组将衰减为指向第一个元素的指针),在这种情况下,数组的大小将被保存在参数传递期间:

void foo(int (*param)[3] ) { assert (sizeof(*param) == sizeof(int)*3; }

但是,如果您的意思是“数组”指针指向一些在编译时大小未知的动态分配内存,那么您肯定需要单独传递大小。

于 2013-10-05T16:40:14.620 回答
0

不可能。这就是为什么你要么使用像链表这样的数据结构,你可以在其中实际确定长度,或者在函数中需要一个长度参数。即使仅使用所需的长度参数,也无法知道它是否正确。因此,您的 API 还应该需要一个标准的哨兵值来终止数组。通常这可能是 NULL 或其他东西,但取决于您的数组类型。

于 2013-10-05T13:28:10.290 回答
-6

你可以看看

function(arr[])
{
   /* not this is pseduo code */
    int i = 0;
    while (*arr[i++] != null)
    {

    }

// i is number of elements
}
于 2013-10-05T13:21:15.753 回答