📌  相关文章
📜  数组函数参数 'arr' 上的 sizeof' 将返回 'int*' 的大小 [-Wsizeof-array-argument] - C++ (1)

📅  最后修改于: 2023-12-03 14:55:00.223000             🧑  作者: Mango

错误信息

在 C++ 编译中,使用数组参数 arrsizeof 操作符返回了 int* 的大小,导致编译器报错,错误信息为:

warning: sizeof on array function parameter 'arr' will return size of 'int *' [-Wsizeof-array-argument]
错误原因

在 C++ 中,数组参数和指针参数是等价的,因此在函数声明中使用数组参数时,编译器实际上将其视为指针参数。对于参数 arr,实际上相当于一个指向 int 类型的指针,因此应用 sizeof 操作符时,返回的是指针类型 int* 的大小。

解决方案

为了避免上述警告,您可以使用 template 替代数组参数,从而保留数组参数的优点,避免指针类型的大小问题。以下代码示例说明 template 的使用方式:

template <size_t N>
void foo(int (&arr)[N])
{
    // 计算数组 arr 的元素个数: N
    int len = sizeof(arr) / sizeof(arr[0]);
    // do something...
}

在函数声明中使用 int (&arr)[N],表明 arr 是一个指向大小为 Nint 数组的引用(而非指针类型)。使用 sizeof 操作符计算数组元素的个数时,可以得到正确的结果。

总结

本文介绍了在 C++ 编译过程中,对数组参数使用 sizeof 操作符导致返回指针类型大小的问题,以及如何通过使用 template 来避免警告,计算数组元素的个数。使用 template 可以保留数组参数的优点,同时避免指针类型的大小问题,提高代码的可读性和易用性。