參加計算客編程大賽時發現,GCC 允許如下「非標準」寫法:
int n = 0;
scanf("%d", &n);
int p[n]; // 變長數組(VLA)
| 編譯器 | VLA 支持 | 說明 |
|---|---|---|
| GCC (C99) | ✅ 支持 | 運行時在棧上分配,n 為變量 |
| MSVC (Visual Studio) | ❌ 不支持 | 要求編譯期常量表達式 |
| C11 標準 | 可選特性 | __STDC_NO_VLA__ 宏指示是否支持 |
#include
int main() {
int n = 0, i = 0, totalTime = 0;
scanf("%d", &n);
int p[n]; // VLA:GCC 允許,MSVC 報錯
if (n >= 1 && n <= 10000) {
for (i = 0; i < n; i++) scanf("%d", &p[i]);
if (n % 2 == 1) {
for (i = 0; i < n; i += 2) totalTime += p[i];
} else {
for (i = 0; i < n - 2; i += 2) totalTime += p[i];
totalTime += (p[n-1] > p[n-2]) ? p[n-1] : p[n-2];
}
printf("%d", totalTime);
}
return 0;
}
// 方案一:動態分配(推薦)
int *p = malloc(n * sizeof(int));
if (!p) return -1;
// ... 使用 p ...
free(p);
// 方案二:固定最大尺寸(競賽常用)
#define MAXN 10000
int p[MAXN];
malloc/固定數組,VLA 僅作快速原型GCC 的 VLA 特性在競賽中可加快編碼,但生產環境應避免使用。理解編譯器差異、掌握動態內存管理,是從「能跑通」到「寫得好」的關鍵一步。