程式中 dp[j-1] 當 j==0 時存取 dp[-1],屬於陣列越界,但程式仍能執行並輸出結果,未崩潰或報錯。
C/C++ 不執行陣列邊界檢查。越界存取屬於「未定義行為」(Undefined Behavior, UB):
dp 為全域/靜態陣列,位於 .bss 段。dp[-1] 正好落在相鄰變數 str 陣列尾端,讀到的是 str 的資料,剛好不影響邏輯,故程式「碰巧」跑通。
-Wall -Wextra -Warray-bounds (GCC/Clang) 或 /Wall (MSVC)。std::vector、std::array,配合 .at() 執行期檢查。-fsanitize=address)、Valgrind。for (int j = 0; j <= i; j++) {
if (str[j] == str[i] && judge(j, i)) {
int prev = (j == 0) ? 0 : dp[j - 1]; // 邊界保護
dp[i] = min(dp[i], prev + 1);
}
}
「能跑」不代表「正確」。C/C++ 將陣列邊界檢查留給程式設計師,務必養成防禦性程式習慣,善用工具提早發現 UB。