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

The*_*der 4 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;
}
Run Code Online (Sandbox Code Playgroud)

此代码的输出为" 1 2 ".但据我说,输出应该只有1.以下是我对此代码的解释:

  1. 首先,将运行main函数,在声明数组"arr"之后,将执行包含语句fun(arr)的下一个语句.
  2. 在该语句中,函数"fun"将使用参数arr调用,该参数包含数组的第一个元素的地址.
  3. 之后,在函数fun下,有一个指针ptr作为参数.当执行此函数时,n的值将计算为1,因为此处ptr的大小为4,ptr [0]的大小也为4.
  4. 接下来,循环将仅运行一次,因为n的值为1,这就是为什么只有'1'将被打印,因为它是ptr [0]的值.

请帮我弄清楚我错在哪里.

Sou*_*osh 10

  • [....]的值n将被计算为,1因为这里的大小ptr4和大小ptr[0]也是4.

嗯,这很常见,但不能保证.

sizeof(ptr)很可能是,导致8,这很可能是你的情况,同时sizeof(int)可估算4,造成的价值2n.这取决于(并随之改变)您的环境和使用的实施.

尝试单独打印,如

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

并亲眼看看.


Joh*_*ica 7

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

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