gpt4 book ai didi

c++ - sizeof 函数在函数中不起作用

转载 作者:行者123 更新时间:2023-11-30 01:12:28 26 4
gpt4 key购买 nike

当我运行这段代码时:

#include <iostream>

using namespace std;

void PrintLengthOfArray(double arr[])
{
int total_bytes = sizeof(arr);
int data_type_bytes = sizeof(arr[0]);
int length = total_bytes / data_type_bytes;

cout << "method 2: \n";
cout << "total_bytes = " << total_bytes << "\n";
cout << "data_type_bytes = " << data_type_bytes << "\n";
cout << "length = " << length << "\n";
}

int main()
{
double arr[3] = {1,2,3};
int total_bytes = sizeof(arr);
int data_type_bytes = sizeof(arr[0]);
int length = total_bytes / data_type_bytes;

// first method
cout << "method 1: \n";
cout << "total_bytes = " << total_bytes << "\n";
cout << "data_type_bytes = " << data_type_bytes << "\n";
cout << "length = " << length << "\n\n";

// second method
PrintLengthOfArray(arr);
}

我得到:

method 1: 
total_bytes = 24
data_type_bytes = 8
length = 3

method 2:
total_bytes = 8
data_type_bytes = 8
length = 1

也就是说,函数中的total_bytes = sizeof(arr)语句只是计算单个元素的大小,或者只是arr[0]。怎么回事?

最佳答案

在第二种方法中,您将数组按值传递给您的函数。它衰减为一个指针,因此大小是指针的大小,在您的情况下为 8 个字节。注意一个函数声明

f(double arr[])

甚至

f(double arr[3])

被编译器翻译成

f(double*)

将数组传递给函数并保持其大小的唯一有意义的方法是通过引用传递,例如

void f(double (&arr)[3]) 
{
std::cout << sizeof arr << std::endl; // displays 3 * sizeof(double)
}

如果您希望能够传递任意长度的数组,我建议通过模板函数按引用传递:

template<typename T, size_t N>
void f(T (&arr)[N])
{
// N gives you the size in the body
}

如果您仍想按值传递,那么“检测”其大小的唯一方法是向您的函数传递一个额外的参数来表示数组的大小。然而,这可能会引起很多麻烦,并且容易出错。 std::vector 你可能会更好或 std::array相反。

关于c++ - sizeof 函数在函数中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34216022/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com