void merge_sort(int arr[], const int len) {
int reg[len]; // ❌ 編譯錯誤:陣列大小必須為編譯期常數
// ...
}
const int len 是**執行期常數**(函式參數在呼叫時才決定值),而 C++ **標準不支援變長陣列 (VLA)**。int reg[len] 要求 len 為**編譯期常數常量** (如字面值、constexpr、#define、enum),編譯器才能在堆疊分配固定大小空間。
void merge_sort(int arr[], int len) {
std::vector reg(len); // 動態分配在堆上,安全、無大小限制
merge_sort_recursive(arr, reg.data(), 0, len - 1);
}
void merge_sort(int arr[], int len) {
int* reg = new int[len];
merge_sort_recursive(arr, reg, 0, len - 1);
delete[] reg; // 必須釋放
}
template
void merge_sort(int (&arr)[N]) {
int reg[N]; // N 為編譯期常數,合法
merge_sort_recursive(arr, reg, 0, N - 1);
}
// 呼叫:int a[10]; merge_sort(a); // 推導 N=10
// C++20 可用 std::span 統一介面
void merge_sort(std::span arr) {
std::vector reg(arr.size());
// ...
}
GCC/Clang 預設啟用 **GNU 延伸支援 VLA**,但這**不符合 C++ 標準**,跨平台移植 (MSVC、嵌入式編譯器) 會失敗。請加上 -pedantic-errors 或 -std=c++17 -Werror=vla 強制標準合規。
函式參數 const int len **不是編譯期常數**,不能用於堆疊陣列大小。請改用 std::vector 或 new[]/delete[],符合標準且安全無大小限制。