【问题标题】:Find the Size of integer array received as an argument to a function in c [duplicate]在c中查找作为函数参数接收的整数数组的大小[重复]
【发布时间】:2014-09-05 06:44:37
【问题描述】:

我想找到作为参数传递给函数的整数数组的大小。 这是我的代码

void getArraySize(int arr[]){
  int len = (sizeof(arr)/sizeof(arr[0])
  printf("Array Length:%d\n",len);
}

int main(){
 int array[] = {1,2,3,4,5};
 getArraySize(array);
 return 0;
}

我收到以下警告

sizeof on array function parameter will return size of 'int *' instead of 'int []' [-Wsizeof-array-argument]

请帮忙,以便我可以在 function getArraySize 中找到整数数组的长度 但是我能够在main 函数中找到array 的大小。由于它是作为pointer 传递的,因此无法在function 中找到length

我确实有一个想法。我可以把它放在try/catch 块中(C 没有尝试捕获,只有jumpers 取决于操作系统)并循环直到我得到segmentation fault

有没有其他方法可以在function 中找到integer array 的长度

【问题讨论】:

  • int array = {1,2,3,4,5}; ???
  • 感谢@SouravGhosh。
  • @ArpitSrivastava ???????
  • 我的错误...我没有看到标签

标签: c arrays


【解决方案1】:

你不能那样做。当您将数组传递给函数时,它会衰减为指向第一个元素的指针,此时会丢失有关其大小的信息。

如果您想知道传递给函数的数组的大小,您需要在 衰减之前将其计算出来,并将该信息与数组一起传递,例如:

void function (size_t sz, int *arr) { ... }
:
{
    int x[20];
    function (sizeof(x)/sizeof(*x), x);
}

【讨论】:

  • 所以你总是必须将它作为参数传递??@paxdiablo
  • @SunilHari 是的 arr 在 main 函数中与 getArraySize 中的不同!在函数getArraySize 声明中,void int arr[]int * arr 相同,arr 是一个指针,但不是一个数组。 -- 这就是你得到的编译器的信息。
  • @Sunil:是的,您需要在仍然可以作为数组访问它的范围内评估大小,而不是在它衰减之后。
  • @paxdiablo: 所以我试图做一些在 c 中不可能的事情。 :). 跳投是个好方法吗?
  • 我赞成这个答案,因为它帮助我解决了手头的问题。然而,我不得不承认,我很震惊地看到这在 C 中并不容易实现——我永远无法理解为什么 C 作为一种语言变得如此受欢迎,当然不包括它导致快速程序的明显答案。但从可用性的角度来看,不得不做这么多穷人的变通办法是相当……令人震惊的。
【解决方案2】:

数组在传递时衰减为指针。

所以 sizeof 仅在将其应用于原始数组时才能找到数组的长度。

所以你需要将数组的长度作为单独的参数传递给函数。

【讨论】:

    【解决方案3】:

    当您将数组传递给函数时,其地址会作为指针传递给函数。

    所以void getArraySize(int arr[]) 等价于void getArraySize(int* arr)

    因此,sizeof(arr) 产生 sizeof(int*),这可能不是您想要的。

    您只能在arr 的声明范围内安全地使用sizeof(arr)/sizeof(arr[0])

    在您的情况下,arr 的声明范围是函数main

    【讨论】:

    • 好的,如果全局声明数组,那有可能吗?
    • @SunilHari:是的,因为arr 的声明范围将包括该文件中的所有函数。
    • @barakmanos :) 谢谢
    • @SunilHari:不客气 :)
    【解决方案4】:

    无法确定函数内部的长度。但是,您通过 arrsizeof(arr) 将始终返回指针大小。所以最好的方法是将元素的数量作为单独的参数传递。

    sizeof 仅适用于将数组的长度应用于原始数组。

    int arr[5]; //real array. NOT a pointer
    sizeof(arr); // :)
    

    但是,当数组衰减为指针时,sizeof 将给出指针的大小,而不是数组的大小。

    void getArraySize(int arr[]){
    sizeof(arr); // will give the pointer size
    }
    

    为什么会发生这种情况是有原因的。我们怎样才能使 C 数组也知道它的长度?

    第一个想法是在将数组传递给函数时不让数组衰减为指针,并继续在类型系统中保持数组长度。

    当您将数组传递给函数时,它会衰减为指针。所以sizeof 函数将返回int * 的大小。这是您的编译器正在编译的警告-

    sizeof on array function parameter will return size of 'int *' instead of 'int []'
    

    正如我所建议的,当您将数组传递给函数时,您还需要传递元素的数量-

    getArraySize(array, 5); // 5 is the number of elements in array
    

    抓住它-

    void getArraySize(int arr[], int element){
    // your stuff
    }
    

    计算数组大小的其他通用方法-

    void getArraySize(int arr[], int len){
      // your stuff
      printf("Array Length:%d\n",len);
    }
    
    int main(){
     int array[] = {1,2,3,4,5};
     int len = (sizeof(arr)/sizeof(arr[0]); // will return the size of array
     getArraySize(array, len);
     return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 2013-06-27
      相关资源
      最近更新 更多