我们如何找到以下C程序的输出?

时间:2017-05-16 17:54:25

标签: c pointers sizeof

我找到了以下C程序的输出,我在GeeksforGeeks上找到了它。这是程序:

#include <stdio.h>
void fun(int ptr[])
{
    int i;
    unsigned int n = sizeof(ptr)/sizeof(ptr[0]);
    for (i=0; i<n; i++)
    printf("%d  ", ptr[i]);
}

// Driver program
int main()
{
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
    fun(arr);
    return 0;
}

此代码的输出为&#34; 1 2 &#34;。但据我说,输出应该只是 1 。以下是我对此代码的解释:

  1. 首先,将运行main函数,在声明数组&#34; arr&#34;之后,将执行包含语句fun(arr)的下一个语句。
  2. 在该声明中,功能&#34; fun&#34;将使用参数arr调用,该参数包含数组的第一个元素的地址。
  3. 之后,在函数fun下,有一个指针ptr作为参数。当执行此函数时,n的值将计算为1,因为此处ptr的大小为4,ptr [0]的大小也为4.
  4. 接下来,循环将只运行一次,因为n的值为1,这就是为什么只有&#39; 1&#39;将被打印,因为它是ptr [0]的值。
  5. 请帮我弄清楚我错在哪里。

2 个答案:

答案 0 :(得分:10)

  
      
  • [....] n的值将计算为1,因为此处ptr的大小为4,且大小为ptr[0] {1}}也是4
  •   

嗯,这很常见,但无法保证

sizeof(ptr)很可能导致8,这可能是您的情况,而sizeof(int)可以评估为4,结果为{{1}对于2。这取决于(并随之改变)您的环境和使用的实施。

尝试单独打印,例如

  • n
  • printf("Pointer size :%zu\n", sizeof(ptr));

亲眼看看。

答案 1 :(得分:7)

现代平台上指针的大小通常为4或8个字节。

在32位平台上,可能是sizeof(ptr) == 4n == 1 在64位平台上,可能是sizeof(ptr) == 8n == 2