如果传递给函数,则确定数组的大小

Cha*_*unt 36 c++ arrays null pointers

如果将数组传递给另一个函数(未传递大小),是否可以确定数组的大小?该数组初始化为int array [] = {XXX} ..

我知道不可能做sizeof,因为它会返回指针的大小.我问的原因是因为我需要在传递数组的其他函数内运行for循环.我尝试过类似的东西:

for( int i = 0; array[i] != NULL; i++) {
........
}
Run Code Online (Sandbox Code Playgroud)

但我注意到在数组的近端,array [i]有时包含像758433这样的垃圾值,这不是数组初始化中指定的值.

Eva*_*ran 51

其他答案忽略了c ++的一个特征.您可以通过引用传递数组,并使用模板:

template <typename T, int N>
void func(T (&a) [N]) {
    for (int i = 0; i < N; ++i) a[i] = T(); // reset all elements
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

int x[10];
func(x);
Run Code Online (Sandbox Code Playgroud)

但请注意,这仅适用于数组,而不适用于指针.

但是,正如其他答案所指出的那样,使用std::vector是更好的选择.

  • +1这是一种解决方案,但会为每个不同的数组大小创建不同的func()符号.也就是说,在不同的地方传递的数组具有不同的大小,该函数将被多次实例化.虽然在调用另一个具有实际实现并接收大小的函数时插入数组的大小可能会有所帮助,可能会将其标记为内联(不是编译器必须遵循您的规则...)template <typename T ,size_t N>内联void包装器(T(&a)[N]){return func(a,N); } - 使用func()作为真正的函数. (9认同)

Fre*_*son 14

如果它在您的控制范围内,请使用STL容器,例如vector或deque而不是数组.


tek*_*ues 9

不,这是不可能的.

一种解决方法:在数组的最后一个值处放置一个特殊值,以便您可以识别它.

  • ...当有人将特殊值放在数组中间时,准备调试这些情况.换句话说:不要这样做.像其他人说的那样:使用明确定义的容器(例如STL)或将数组的大小与它一起作为函数的其他参数传递 (12认同)

Igo*_*kon 6

一个明显的解决方案是使用STL.如果不可能,最好明确传递数组长度.对于这种特殊情况,我对使用哨兵值技巧持怀疑态度.它对指针数组的效果更好,因为NULL对于标记是一个很好的值.对于整数数组,它并不那么容易 - 你需要有一个"神奇的"哨兵值,这是不好的.

旁注:如果您的数组已定义并初始化为

 int array[] = { X, Y, Z };
Run Code Online (Sandbox Code Playgroud)

然后,在与循环相同的范围内

sizeof(array)将以字节为单位返回实际大小,而不是指针的大小.你可以得到数组长度

sizeof(array) / sizeof(array[0])
Run Code Online (Sandbox Code Playgroud)

但是,在一般情况下,如果将数组作为指针,则无法使用此技巧.