十三誡增修--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