📜  不要将sizeof用于数组参数

📅  最后修改于: 2021-05-20 06:45:50             🧑  作者: Mango

考虑下面的程序。

#include
void fun(int arr[])  
{
  int i;   
  
  /* sizeof should not be used here to get number 
    of elements in array*/
  int arr_size = sizeof(arr)/sizeof(arr[0]); /* incorrect use of sizeof*/
  for (i = 0; i < arr_size; i++) 
  {  
    arr[i] = i;  /*executed only once */
  }
}
  
int main()
{
  int i;  
  int arr[4] = {0, 0 ,0, 0};
  fun(arr);
    
  /* use of sizeof is fine here*/
  for(i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
    printf(" %d " ,arr[i]);
  
  getchar();  
  return 0;
}    

输出:在IA-32机器上为0 0 0 0。

函数fun()接收一个数组参数arr [],并尝试使用sizeof运算符找出arr []中的元素数量。
在C中,阵列参数均被视为指针(见的详细信息)。因此,表达式sizeof(arr)/ sizeof(arr [0])变为sizeof(int *)/ sizeof(int),这导致IA 32位计算机为1(int和int *的大小为4),并且内部的for循环fun()仅执行一次,而与数组的大小无关。

因此,在这种情况下,不应使用sizeof来获取元素数量。数组大小(或长度)的单独参数应传递给fun()。因此,更正后的程序是:

#include
void fun(int arr[], size_t arr_size)  
{
  int i;   
  for (i = 0; i < arr_size; i++) 
  {  
    arr[i] = i;  
  }
}
  
int main()
{
  int i;  
  int arr[4] = {0, 0 ,0, 0};
  fun(arr, 4);
    
  for(i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
    printf(" %d ", arr[i]);
  
  getchar();  
  return 0;
}    
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”