如何让C程序员获得已传递给函数的数组的大小?

时间:2015-02-22 05:36:59

标签: c arrays

他们是否总是传递大小作为参数,例如

void lame_function (int * arr, int n)
{
    // .. do something 
}

或是否有一个技巧让编译器在函数内运行sizeof(arr)的方式与在函数外部运行它的方式相同?

我已经尝试过制作签名

void lame_attempt (int ** arr, int n)
{
   // ... use sizeof(*arr); 
}

并试图像

一样使用它
int myArray [] = {1, 50, 39, 22};
lame_attempt ( &myArray );

但那并没有奏效。

必须有一种方法,因为如果我是一个禁止用超过1个参数编写函数的宗教成员呢?

有些C程序员做了像

这样的结构
typedef struct realArray { int * ptr0; int len; } realArray;

并在整个计划中使用它?

1 个答案:

答案 0 :(得分:0)

无法获得通过指针或C中的引用传递的数组的大小。

原因是,C只知道函数签名中的内容。任何人都可以使用与签名匹配的任何类型的数组来调用此函数。

简而言之:如果您不想拥有多个参数,则必须始终传递结构。许多库都是这样做的,它们为更复杂的数据结构传递结构。

在这种情况下,C字符串是特殊的。在大多数情况下,它们通过的时间不会很长,这是因为按照惯例,它们必须由“0”和“0”完成。字符。这也使它们变得危险,因为当你忘记这个最终字符或保留太少的内存(经常出现的错误)时,你的代码就会崩溃。