在 main 和函数中获取同一数组的不同 sizeof 值

Getting different sizeof values of the same array in main and in a function

在下面的代码中,当我在 main() 中打印 sizeof(arr) 时,我得到输出 32。但是当我将相同的数组发送到函数 print() 并打印出 sizeof(arr), 我得到 8.

我的问题是,它们不应该都是 8,因为在这两种情况下 arr 都是指向第一个元素的指针吗?

代码:

#include <iostream>

using namespace std;

void print(int arr[])
{
    cout << "from function print(): " << sizeof(arr);
}

int main()
{
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };

    cout << "from main: " << sizeof(arr) << endl;

    print(arr);

    return 0;
}

输出:

main.cpp:8:46: warning: ‘sizeof’ on array function parameter ‘arr’ will return size of ‘int*’ [-Wsizeof-array-argument]                       
main.cpp:5:20: note: declared here                                                                                                            
from main: 32                                                                                                                                 
from function print(): 8                                                                                                                      
                                                                                                                                              
...Program finished with exit code 0                                                                                                          
Press ENTER to exit console.  

My question is, shouldn't they both be 8, because arr is a pointer to the first element in both cases?

An array name is not a pointer。在 main 中,在声明和初始化 arr 的地方,您将获得 arr 的实际大小,在您的情况下为 32 字节,8 倍(元素数)4(您的系统 int 字号)。

sizeof 能够计算数组的总大小,因为它是数组类型,这是 C++ 标准规定的:

[expr.sizeof]

[...] When [sizeof is] applied to an array, the result is the total number of bytes in the array. This implies that the size of an array of n elements is n times the size of an element.

void print(int arr[]){/*...*/}

你说得对,int arr[]参数会衰减到指向arr的指针,所以sizeof(arr)是指针的大小,sizeof是不行的要找到作为参数传递给它的指针指向的对象的大小,它将呈现指针的大小,在您的系统中它是 8 个字节,因为它通常在 64 位系统中。

由于您使用的是表达式而不是类型,因此您可以删除括号并仅使用 sizeof arr

旁注,using namespace std; is not advised

arr 在这两种情况下都不是指向第一个元素的指针。在 main arr 中是一个数组。在printarr是一个指针。当调用 print 时,数组的名称 arr 被转换为指向其第一个元素的指针。

所以在 main sizeof 中知道 arr 是一个数组并计算它的总大小。但是在 print 中,sizeof 只知道 arr 是一个指针,它不知道它指向数组的第一个元素。事实上,没有理由它必须指向任何数组的第一个元素。在 main 中你可以有 print(arr + 1);,现在 print 中的 arr 指向数组的第二个元素。或者你可以 int num = 1; print(&num); now arr in print 根本不指向数组。

所以 print 中的所有 sizeof 都知道 arr 是一个指针,因此它会为您提供该指针的大小。

由于所有这些(以及更多)原因,您没有看到数组在 C++ 中被大量使用。大多数时候你应该更喜欢使用 std::vector。在大多数情况下,向量优于数组。