十三诫增修--02:你不可以存取超过阵列既定范围的空间

楼主: wtchen (没有存在感的人)   2016-05-12 21:04:41
02. 你不可以存取超过阵列既定范围的空间
错误例子:
int str[5];
for (int i = 0 ; i <= 5 ; i++) str[i] = i;
正确例子:
int str[5];
for (int i = 0; i < 5; i++) str[i] = i;
说明:宣告阵列时,所给的阵列元素个数值如果是 N, 那么我们在后面
透过 [索引值] 存取其元素时,所能使用的索引值范围是从 0 到 N-1
C/C++ 为了执行效率,并不会自动检查阵列索引值是否超过阵列边界,
我们要自己来确保不会越界。一旦越界,操作的不再是合法的空间,
将导致无法预期的后果。
备注:
C++11之后可以用Range-based for loop提取array、
vector(或是其他有提供正确.begin()和.end()的class)内的元素
可以确保提取的元素一定落在正确范围内。
例:
// vector
std::vector<int> v = {0, 1, 2, 3, 4, 5};
for(const int &i : v) // access by const reference
std::cout << i << ' ';
std::cout << '\n';
// array
int a[] = {0, 1, 2, 3, 4, 5};
for(int n: a) // the initializer may be an array
std::cout << n << ' ';
std::cout << '\n';
补充资料:
http://en.cppreference.com/w/cpp/language/range-for
作者: HolyBugTw (HolyBug)   2016-05-13 11:47:00
不是找碴...不过又有个小疑问假使我宣告了int val[2][2],但是我却要印val[0][3]这样算不算是存取超过阵列既定空间?
作者: CoNsTaR ((const *))   2016-05-13 11:56:00
不算,你给负数都可以 记得标准有
作者: HolyBugTw (HolyBug)   2016-05-13 12:08:00
感谢楼上的解惑
楼主: wtchen (没有存在感的人)   2016-05-13 16:12:00
可以看C99 standard 6.5.2.1

Links booklink

Contact Us: admin [ a t ] ucptt.com