【问题标题】:Size of array when passed to a function [duplicate]传递给函数时数组的大小[重复]
【发布时间】:2014-10-27 00:01:35
【问题描述】:

谁能解释一下下面程序的输出?

   #define SIZE 10
  void size(int arr[SIZE],int i[SIZE])
  {
         printf("size of array is:%d %d\n",sizeof(arr),sizeof(i));
  }

  int main()
    {
        int arr[SIZE],i[SIZE];
       printf("%d %d\n",sizeof(arr),sizeof(i));
        size(arr,i);
        return 0;
     }                                                                                

      OUTPUT
      40 40 
     8 8

为什么是 8 8? 请帮忙

【问题讨论】:

    标签: c arrays


    【解决方案1】:
    1. main() 中,您正在获取数组的大小。

    2. 当我们调用size(arr, i); 时,我们发送的是arri 的基地址。当我们将变量的地址传递给函数时,它会将地址存储在指针中。因此,您在 size() 函数中获得了指针的大小。

    【讨论】:

    • @TheParamagneticCroissant:是的,你是对的,它们不一样!我进行了编辑。感谢您指出 :) arr 给出了第一个 int 的地址,而 &arr 给出了 ints 数组的地址。同样arr+1 将给出下一个整数的地址,而&arr+1 将给出下一个10 整数数组的地址。
    【解决方案2】:

    数组本身替换为指针(但它们不是指针)。所以,代码

    a[i]
    

    等价于

    *(a + i)
    

    当数组不是动态的时,sizeof 操作符可以确定它的大小(在它的范围内),但是当它被传递给函数时,它是一个指针。所以

    sizeof(any_pointer) == sizeof(size_t)
    

    由于结果,您似乎在 64 位处理器上工作

    【讨论】:

    • sizeof(any_pointer) == sizeof(size_t) - 你的意思是说这总是正确的吗?因为它不是……
    • 不是任何指针,但没有任何其他情况...你能举个例子,指针不是很小,很大等,它不是 size_t;我真的很感兴趣。
    • 那么,它与问题有什么关系? OP 没有询问size_t 的大小。
    • 他询问了大约 8 个字节。为什么 10*sizeof(int) == 40 而指针是 8
    • 是的,他做到了。因此没有必要将sizeof(size_t) 带入图片——它只会让 OP 感到困惑。
    【解决方案3】:

    因为参数int arr[SIZE]int i[SIZE] 不像main 函数中那样是数组。它们是指针。在 64 位机器上,指针的大小通常为 8。

    【讨论】:

    • @CodeHacker 如果它第一次在您的机器上运行时是 8,那么它将继续始终是 8。但在另一台计算机上,它可能会有所不同。
    猜你喜欢
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多