【问题标题】:Why does size of array differ in main and other function? [duplicate]为什么数组的大小在主函数和其他函数中不同? [复制]
【发布时间】:2021-11-23 14:02:45
【问题描述】:

我不是C++新手,但是今天发现数组的大小在main函数和其他函数中是不一样的。这是为什么?我想这与指针有关。

#include<bits/stdc++.h>
using namespace std;

void func(int arr[]){
    cout<<"func size: "<<sizeof(arr)<<"\n";
}

int main(){
    int arr[5];
    cout<<sizeof(arr)<<"\n";
    func(arr);
    return 0;
}

您可以测试此代码以查看差异。

【问题讨论】:

  • 它被称为array to pointer decay。将数组传递给函数时,大小信息会丢失。这就是为什么许多作用于数组的 C 函数需要一个数组参数和一个大小参数,以及为什么在 C++ 中更喜欢使用像 std::array 这样提供值语义的类。
  • 好的,谢谢!这就解释了一切。

标签: c++ arrays function


【解决方案1】:

因为数组衰减为指针What is array to pointer decay?

可以通过引用传递数组来查看大小相同,如下

#include <iostream>

template <class T, size_t n> void func(T (&arr)[n]) {
    std::cout << "func size: " << sizeof(arr) << "\n";
}

int main() {
    int arr[5];
    std::cout << sizeof(arr) << "\n";
    func(arr);
}

Demo

看看Why is "using namespace std;" considered bad practice?Why should I not #include <bits/stdc++.h>?

【讨论】:

  • 这是避免C++中数组衰减的正确方法
【解决方案2】:

问题已得到准确回答。但是,如果您想安全起见,则只有在编译期间可以为您指出编译器标志。使用-Wall 标志你会收到这样的警告

'warning: ‘sizeof’ on array function parameter ‘arr’ will return size of ‘int*’ [-Wsizeof-array-argument]'

note: declared here
4 | void func(int arr[]){

我假设你没有使用标志。

也可以从 c++20 开始使用 std::ssize() 而不是 sizeof()

std::size and std :: ssize

【讨论】:

    【解决方案3】:

    在主函数 cout 数组的返回端,但是当你传入 func 函数时,它正在打印地址,这就是为什么两者不一样。为了您的验证,您可以检查主函数和下面的函数中的数组地址是代码。 #include

    using namespace std;
    void func(int arr[]) {
      cout << "func size: " << sizeof( & arr) << "\n";
                                     }
    
    int main() {
      int arr[5];
      cout << sizeof( & arr) << "\n";
      func(arr);
      return 0;
                        }
    

    【讨论】:

      猜你喜欢
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 2011-02-14
      • 2017-01-19
      • 2023-03-24
      相关资源
      最近更新 更多