【问题标题】:how sizeof() works in pass by reference argumentssizeof() 如何通过引用参数传递
【发布时间】:2014-03-07 10:17:52
【问题描述】:

我将一个数组传递给函数并试图找到数组的长度。但结果出乎意料。谁能解释一下?

int main()
{
     int array[10]={0};
     func(array);
     return 0;
}
void func(int arr[])
{
    printf("length of an array is %d ",(sizeof(arr)/sizeof(arr[0]));
}

它给出了答案 2。 当我在 main 函数中尝试相同的操作时,它工作正常(答案是 10)。 //在linux中使用gcc编译器

【问题讨论】:

  • C 中没有通过引用传递。这就是你的答案。

标签: c arrays function pointers


【解决方案1】:

在我看来,结果是因为sizeof(arr) == 8(PC 上指针的大小)和sizeof(arr[0]) == 4 因为它是一个整数,因此是8/4==2

这个声明:void func(int arr[]) 告诉函数期望 一个指向 int 的指针作为参数。

我不清楚是否可以通过引用计算sizeof 一个数组。 C 接受数组引用作为参数的函数总是倾向于接收它们的长度作为参数。

main() 函数的区别在于main 内部的array 变量是int[10] 类型,因此sizeof 可以得到它的字节长度。在func 中,arrint* 类型,所以sizeof 只提供指针的字节长度。

【讨论】:

    【解决方案2】:

    您正在发送和接收一个数组 pionter,而不是数组。

    同时发送 arg::

    func(array[10]);
    

    在接收 arg 时:

    void func(int array[10])
    

    但是发送总数组不好。所以发送和接收如下参数。

    func(array, arry_size);  //function call
    void func(int array[], int length)  //defin
    

    【讨论】:

    • int length 最好是size_t length
    • @alk。通过看到这个问题,我们可以说他是 c 的新手。在这里你是对的。 bcoz 更好地遵循标准。
    【解决方案3】:

    您必须记住,数组会衰减为指针。这意味着在函数func 中,变量arr 实际上不是一个数组而是一个指针。对指针执行sizeof 会返回指针的大小,而不是指针指向的大小。

    您会得到结果2,因为您在一个 64 位系统上,其中指针是 64 位(即 8 个字节),当除以 int(即 4 个字节)的大小时,您会得到结果2

    【讨论】:

      【解决方案4】:
      sizeof(arr)
      

      是指针的大小,而不是arr指向的块的大小。

      【讨论】:

        【解决方案5】:

        当您将数组作为参数传递给函数时,数组衰减为指向数组开头的指针。与数组不同,指针中没有存储元信息。一个好的做法是将大小作为附加参数传递给函数。

        void func(int *arr, int size);
        

        这是 C 标准所说的(C99 6.3.2.1/3 - 其他操作数 - 左值、数组和函数指示符):

        除非它是 sizeof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串字面量,否则类型为 ''array of type'' 的表达式将转换为类型为 ' 的表达式'pointer to type'' 指向数组对象的初始元素并且不是左值

        所以,一旦你将它传递给函数 - 在函数内部,它不再是一个数组,而是一个指针。

        【讨论】:

          【解决方案6】:

          sizeof() 运算符返回数据类型的大小。这里的 int 大小是 2。

          【讨论】:

          • 我已经提到了 int 数组。那就是我提到的int
          猜你喜欢
          • 2012-02-24
          • 2010-10-07
          • 2015-07-06
          • 1970-01-01
          • 2011-08-21
          • 2017-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多