【问题标题】:Getting different sizeof values of the same array in main and in a function [duplicate]在main和函数中获取同一数组的不同sizeof值[重复]
【发布时间】:2020-08-05 08:54:57
【问题描述】:

在下面的代码中,当我在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.  

【问题讨论】:

  • 副本没有回答问题:不应该都是 8,因为在这两种情况下 arr 都是指向第一个元素的指针吗?投票重新开放。跨度>
  • 通常将数组传递给函数将被“转换”为指向第一个元素的指针。这发生在这里,并导致指针的大小而不是数组内容的大小。所以感觉是重复的......无论如何,你有很多答案或多或少重复所有这些事情......
  • @Klaus,虽然我同意这是一个常见问题,但通常情况正好相反,在这种情况下,问题是为什么 sizeof 能够找出数组类型的总大小。

标签: c++ arrays sizeof


【解决方案1】:

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

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

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

[expr.sizeof]

[...] [sizeof is] 应用于数组时,结果是数组中的总字节数。这意味着 n 元素数组的大小是元素大小的n 倍。

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

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

当您使用表达式而不是类型时,您可以删除括号并仅使用 sizeof arr

顺便说一句,using namespace std; is not advised

【讨论】:

  • @AYUSSHINIGAM 您似乎没有理解答案。 main 中的 arr 是一个数组,但 print 中的 arr 是一个指针。无法从指针中获取数组的大小(甚至无法知道指针是否指向数组)。
  • @AYUSSHINIGAM,是类型的问题,对于数组来说,sizeof可以计算出数组的总大小,因为它是数组类型,而在指针类型中,sizeof会渲染大小类型,它不会以任何方式取消引用或访问指针指向的值。
  • @AYUSSHINIGAM,我在答案中添加了一些文档,可能会澄清您的疑问。
【解决方案2】:

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

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

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

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

【讨论】:

  • 如果一个已知大小,vectors 并不优越,因为它们会无缘无故地进行动态分配。在这种情况下,std::array 优于 C 样式数组和std::vector,因为它带有它的大小(并且是可复制的等)并且不需要动态分配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多