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

How do we find the output of the following C program?

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

#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;
}

这段代码的输出是“1 2”。但根据我的说法,输出应该只是 1。这是我对这段代码的解释:

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

请大家帮我找出错误的地方。

  • [....] the value of n will be calculated as 1 since here the size of ptr is 4 and the size of ptr[0] is also 4.

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

sizeof(ptr) 很可能会导致 8,这很可能在您的情况下,而 sizeof(int) 可以计算为 4,结果值为 2 对于 n。这取决于(并随着)您的环境和使用的实现而变化。

尝试单独打印它们,例如

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

亲眼看看。

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

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