sizeof 不应作用于数组参数
10.7.1 ID_sizeof_arrayParameter
被声明为数组的形式参数等同于指针,对其使用 sizeof 无法获取到数组大小,往往意味着错误。
示例:
void fun(char a[10]) {
memset(a, 0, sizeof(a)); // Non-compliant
}
例中参数 a 是一个指针,sizeof(a) 等同于 sizeof(char*),而不是 sizeof(char[10])。
在 C++ 代码中,如果有必要将参数设为数组,可以使用引用的方式,如:
void fun(char (&a)[10]) {
memset(a, 0, sizeof(a)); // Compliant
}
这样 sizeof(a) 便等同于 sizeof(char[10])。
更好的方法是用安全性更高的 std::array 等容器代替 C 数组,如:
void fun(array<char, 10>& a) {
a.fill(0); // Safe and brief
}
相关
依据
ISO/IEC 9899:1999 6.7.5.3(7)
ISO/IEC 9899:2011 6.7.6.3(7)
ISO/IEC 14882:2003 13.1(3)
ISO/IEC 14882:2011 13.1(3)