我被這個小代碼迷住了:
#include <stdio.h>
int main()
{
int limit = 0;
scanf("%d", &limit);
int y[limit];
for (int i = 0; i<limit; i ) {
y[i] = i;
}
for (int i = 0; i < limit; i ) {
printf("%d ", y[i]);
}
return 0;
}
這個程式到底是如何沒有段錯誤的,因為限制(陣列的大小)僅在運行時分配?
C 最近有什么變化嗎?在我的理解中,這段代碼不應該作業。
uj5u.com熱心網友回復:
int y[limit];是一個可變長度陣列(或簡稱 VLA),是在 C99 中添加的。如果支持,它會在堆疊上分配陣列(在具有堆疊的系統上)。它類似于使用依賴于機器和編譯器的alloca函式(_alloca在 MSVC 中呼叫):
例子:
#include <alloca.h>
#include <stdio.h>
int main()
{
int limit = 0;
if(scanf("%d", &limit) != 1 || limit < 1) return 1;
int* y = alloca(limit * sizeof *y); // instead of a VLA
for (int i = 0; i<limit; i ) {
y[i] = i;
}
for (int i = 0; i < limit; i ) {
printf("%d ", y[i]);
}
} // the memory allocated by alloca is here free'd automatically
請注意,VLA:s 自 C11 以來是可選的,因此并非所有 C 編譯器都支持它。例如,MSVC 沒有。
uj5u.com熱心網友回復:
這在 Visual Studio 中無法編譯,因為限制“錯誤 C2131 運算式未計算為常量”
如果您將 limit 設定為 constexpr,那么編譯器不會介意,因為您告訴它它不會改變。您不能使用 0,因為將陣列設定為恒定大小長度為零是無稽之談。
這為您運行什么編譯器?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/431179.html
標籤:C
上一篇:struct上的指定初始化程式導致strcpy和realloc中的段錯誤
下一篇:計算Linux中的最大打開檔案數
