0

如何制作一个接收数组作为参数的正确函数?在下面的代码中,结果应该是 36,但在我的函数中只显示 4。它似乎只传递了第一个元素。

void test(float v[]){
    printf("size: %d\n", sizeof(v)); //RESULT: 4
}

int main(){
    GLfloat vv[] = {
        0, 0, 0,
        1, 1, 0,
        1, 0, 0
    };
    printf("size: %d\n", sizeof(vv));  //RESULT: 36
    test(vv);
    return 0;
}
4

2 回答 2

7

当您将数组作为参数传递时,它会衰减为指向第一个元素的指针。
sizeof给你指针的大小而不是数组。

最简单的解决方案是将大小作为单独的参数传递给函数。

void myFunction(float[] array, size_t size);
于 2013-03-09T06:41:42.990 回答
3

如何制作一个接收数组作为参数的正确函数?

如果数组在编译时具有已知的大小,如您的示例所示,则可以使用模板函数。此示例通过 const 引用获取数组元素:

template< class T, size_t N >
void foo( const T (&data)[N] )
{
  // length of array is N, can access elements as data[i]
}

int main(){
  GLfloat vv[] = {
    0, 0, 0,
    1, 1, 0,
    1, 0, 0
  };

  foo(vv);
}    

这就是这个问题的字面答案。我会使用具有清晰复制、分配和引用语义的类型,例如std::array

template <size_t N>
void foo(const std::array<GLfloat, N>& data)
{
   // data looks like a C array, but has size() and many other methods
}

int main(){
  std::array<GLfloat, 9>{
      { 0, 0, 0,
        1, 1, 0,
        1, 0, 0 }
  };

  foo(vv);
}  
于 2013-03-09T08:41:17.457 回答