【问题标题】:How to know size of an array after passing it to a function [duplicate]将数组传递给函数后如何知道数组的大小[重复]
【发布时间】:2013-12-26 10:20:14
【问题描述】:

在将数组传递给函数后,我必须知道数组的大小。例如,

#include<stdio.h>
void func(char *ptr)
{
     printf("%d\n",------); //Here i want the actual size of the array passed to ptr. What to fill in the blank to get total size of the arr[]
}
main()
{
    char arr[10] = "Hello";
    printf("%d\n",sizeof(arr));  // here it is giving 10 bytes that is equal to total size of the array
    func(arr);
}

【问题讨论】:

  • 您无法从指针中检索数组的大小。您需要将数组大小作为单独的参数传递,或者遍历数组元素,直到找到一个标记结束的标记值(就像 char* 字符串一样)
  • 在 C 中,您应该将数组的大小传递给函数,因为在 C 中只传递了数组第一个元素的地址。
  • 这就是为什么这么多函数都带有size_t size参数的原因。
  • 每个人都说一样的......我应该接受哪一个?
  • @Chinna; Every one is saying same.... Which one should i accept? :在这种情况下应用FCFS(先到先服务)算法。 ;)

标签: c arrays pointers sizeof


【解决方案1】:

不,你不能,编译器不知道函数的指针指向一个数组,不过有一些解决方案,我可以声明:

1) 用函数参数传递长度:

void func(char *ptr, int length)
{
    printf("%d\n",length);
}

2)如果你的数组总是char类型,你可以放一个NULL char('\0')并使用strlen

#include  <stdio.h>
#include <string.h>

void func(char *ptr)
{
    printf("%zu\n",strlen(ptr) + 1); 
}
int main()
{
    char arr[10] = {10,2,11,223,4,45,57,11, 12 ,'\0'};
    printf("%zu\n",sizeof(arr));
    func(arr);
}
// prints 
//10
//10

干杯

【讨论】:

  • 打印size_t 类型值(由sizeofstrlen() 返回)的正确格式是%zu
  • 感谢 uwind,编辑 :)
【解决方案2】:

没办法。您也必须传递数组的大小。当您将数组传递给函数时,实际上您将指针传递给它的第一个元素。在这种情况下,函数不知道数组的大小。

【讨论】:

    【解决方案3】:

    Arrays 在传递给函数时衰减为 pointers。仅使用指针,您无法获取数组的大小。您必须再向调用函数传递一个参数,即数组的size。 示例:

    #include <stdio.h>
    void fun(int myArray[10])
    {
        int i = sizeof(myArray);
        printf("Size of myArray = %d\n", i);
    }
    int main(void)
    {
        // Initialize all elements of myArray to 0
        int myArray[10] = {0}; 
        fun(myArray);
        getch();
        return 0;
    }
    

    这里的输出将是 4(取决于您平台上的指针大小,可能会有所不同) 这是因为,“arrays decays into pointers” 编译器假装数组参数被声明为指针,因此打印了指针的大小。

    因此,您必须将大小作为另一个参数传递给调用函数...

    #include <stdio.h>
    void fun(int myArray[10], int size)
    {
        printf("Size of myArray = %d\n", size);
    }
    int main(void)
    {
        // Initialize all elements of myArray to 0
        int myArray[10] = {0}; 
        fun(myArray, sizeof(myArray));
        getchar();            ^----------------Here you are passing the size
        return 0;
    }
    

    所以,这里的输出是 40...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 2014-10-27
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 2018-04-25
      • 2011-03-04
      相关资源
      最近更新 更多