我得到一个Lint警告661 / 662.他们意味着可能访问/创建越界指针。但我确实检查边界,不可能超出范围。任何想法如何摆脱它?
const my_enum_type my_array[] = {MY_FIRST_ENUM_VALUE, MY_SECOND_ENUM_VALUE, MY_THIRD_ENUM_VALUE};
for(i = 0; i < sizeof(my_array); i++){
//do stuff such as
my_variable = my_array[i];
my_function(my_array[i]);
}
我使用my_array[i]
的行抱怨代码为661/662。
答案 0 :(得分:6)
sizeof(my_array)
不是你想要的。你想要sizeof(my_array) / sizeof(*my_array)
。
您可以使用迭代器:
for(auto it = std::begin(my_array); it != std::end(my_array); ++it){
//do stuff such as
my_variable = *it;
my_function(*it);
}
或直接针对范围:
for (const auto& e : my_array){
//do stuff such as
my_variable = e;
my_function(e);
}
答案 1 :(得分:5)
sizeof
返回字节数,而不是元素,所以我猜错误是有效的。
使用sizeof(my_array) / sizeof(my_array[0])
获取元素数。
答案 2 :(得分:4)
sizeof(my_array)
不返回数组中的元素数,它返回数组的字节大小。
获取大小的传统C方式是sizeof(my_array) / sizeof(my_array[0])
,但更安全的C ++ 11方法是使用来自&lt; std::extent&gt;的type_traits:
std::extent<decltype(my_array)>::value
答案 3 :(得分:2)
sizeof(myarray)
返回对象表示的字节大小。所以不是数组中的项目数,而是整个数组大小。如果sizeof(my_enum_type) > 1
i
超出范围。
尝试sizeof(myarray) / sizeof(my_enum_type)