在 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++ 标准规定的:
[...] 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
中是一个数组。在print
中arr
是一个指针。当调用 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
。在大多数情况下,向量优于数组。
在下面的代码中,当我在 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++ 标准规定的:
[...] 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 isn
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
中是一个数组。在print
中arr
是一个指针。当调用 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
。在大多数情况下,向量优于数组。