問題是,即使結果 包含數組中的10個數字,它也會將計數值打印爲'11'。
如果我正確理解這一點,您將訪問大小爲10的數組的第10個索引,這是未定義的行爲,因爲它超出了邊界訪問範圍。
如果您使用C++ 03,你能避免原陣列的使用和喜歡std::vector
。 std::vector
自動處理內存,爲您和其at()
成員函數,如果你嘗試提供一個出界指數會拋出異常。被警告operator[]
不提供邊界檢查。
在C++ 11,可以使用std::array
。到std::vector
相似,它有at()
提供邊界檢查和operator[]
哪些沒有。非成員函數std::get
提供編譯時邊界檢查。這裏有一個例子:
std::array<int, 5> arr { 1, 2, 3, 4, 5 };
std::get<6>(arr);
// error: static assertion failed: index is out of bounds
arr.at(6);
// terminate called after throwing an instance of 'std::out_of_range'
// what(): array::at: __n (which is 6) >= _Nm (which is 5)
如果你堅持原始陣列,編譯器可能會與幫助抓出界失誤,如LLVM的不確定行爲消毒(這已經被移植到GCC的診斷或工具)和Valgrind的(所報道的內存錯誤)下面是鏘給人的出界警告的例子:
int arr[5] = { 1, 2, 3, 4, 5 };
arr[6];
// warning: array index 6 is past the end of the array (which contains 5 elements) [-Warray-bounds]
和消息,如果你有-fsanitize=address,undefined
運行它,您將獲得:
runtime error: index 6 out of bounds for type 'int [5]'
GCC在一個循環中捕獲未定義行爲:
for (int i = 0; i < 6; ++i)
std::cout << arr[i];
// warning: iteration 5u invokes undefined behavior [-Waggressive-loop-optimizations]
這是使用-Wall -Wextra -pedantic
,這兩種編譯器的工作奠定了良好的說法,但被警告,你得到確切的診斷各不相同,所以總是測試多代碼工具。
那麼,你基本上是試圖增加邊界檢查,基本數組? – 2014-11-01 15:48:15
是的,這將是一種說法。 – 2014-11-01 15:51:00
由於您使用的是C++,因此寧願使用'std :: array'或'std :: vector'。 'at()'成員函數提供了運行時邊界檢查,而'std :: get'提供了編譯時間邊界檢查。否則,請考慮使用靜態分析工具或clang和gcc的'-fsanitize = undefined'。海灣合作委員會也可能通過警告超出界限。 – 2014-11-01 15:52:16