【整理】C语言中如何获得作为函数参数的数组的大小

【问题】

C语言中,

关于如何获得一个,当做参数传递到函数内的一个数组的大小。

之前以为是可以通过类似于:

sizeof(b) / sizeof(b[0])

的,去获得参数中的数组的大小而定。

【解决过程】

1后来经过实际测试,说明自己的想法是错的:

2. 对应的,这里:

How do you get the size of array that is passed into the function?

也讨论到了。

3.相关测试代码:

void func(unsigned char* a) {
//void func(unsigned char a[]) {
    int singleItem = sizeof(a[0]);
    //int wholeSize = sizeof(a); //4, not 10
    int wholeSize = sizeof(*a); //1, not 10
    int arrSize = wholeSize/singleItem;
}
int _tmain(int argc, _TCHAR* argv[])
{
    unsigned char b[10] = {0};
    func(b);
    return 0;
}

 

【总结】

所以结论是:

1 . 一个数组array,当被当做参数传递到别的函数里面时,别的函数中,是无法获得该数组的大小的;

想要在被调用的函数中,得知原数组的大小,则只能另外添加一个参数,用于指定数组的大小,即,从:

void print_array(int* b)
{
  int sizeof_b = sizeof(b) / sizeof(b[0]);
  int i;
  for (i = 0; i < sizeof_b; i++)
    {
      printf("%d", b[i]);
    }
}

变成:

void print_array(int* b, int num_elements)
{
  for (int i = 0; i < num_elements; i++)
    {
      printf("%d", b[i]);
    }
}

 

原因:

当一个数组,被当做参数,传递到(别的)被调用的函数中时,

其实只是传递过去一个指针过去。

该指针所指向的地址是,该数组的第一个元素,即someArray[0]

所以,是无法获得对应的数组的整个的大小的。

 

2. 在当前函数内,则是可以通过类似于:

int arraySize = sizeof(someArray) / sizeof(someArray[0]);

的方式,得到本数组的大小的。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量