簡體   English   中英

C編程,為什么這個大型數組聲明會產生分段錯誤?

[英]C programming, why does this large array declaration produce a segmentation fault?

此代碼在數組聲明期間產生分段錯誤。 我很困惑為什么會這樣。 我故意選擇2000000000作為值,因為它低於2 ^ 31並且可以適合整數變量。

int main()
{

    int  nums_size = 2000000000;

    int nums[nums_size];

    int i;
    for(i = 0; i < nums_size; i++) {
        nums[i] = i;
    }


    return 0;

}

嗯,首先,這是20億個整數。 如果您的平台上有32位地址空間且int的大小為4個字節(通常是32位平台),則無法存儲那么多整數,句點。

即使如此,您在堆棧上只有很多可用空間,這是自動變量所在的位置。

如果你需要一個非常大的數組,你應該使用malloc() dyncamically分配(如果你這樣做,請確保在完成后使用free()它!)。

int  nums_size = 2000000000;

int nums[nums_size];

並不意味着200,000000字節的int,它意味着200,000個int類型的元素,在32位平台上意味着你消耗了近8GB的內存 - 這是不可能的。

你正在堆棧上分配一個巨大的數組。 實際上沒有C / C ++編譯器能正確處理。

您可以將它移動到全局變量(它將通過在編譯時映射可執行文件中的內存來靜態分配空間),或者切換到malloc陣列。

當然,這仍然是一次性要求的大量內存,但至少我提到的方法將避免立即的段錯誤

局部變量在堆棧上分配。 提供給應用程序的固定數量的堆棧空間(通常為1MB-8MB,因OS而異)。 一般規則是使用malloc()分配大量數據。

你的問題的答案很簡單: stackoverflow 不,不,不是網站,而是“溢出堆棧”的實際過程。 您沒有足夠的堆棧來存儲該陣列。 就如此容易。 在內存受限的系統上執行此操作純屬瘋狂。 另見這個問題

這個版本在我的電腦上正常運行:

const int nums_size = 2000000000;
int nums[nums_size];

int main()
{
    int i;
    for(i = 0; i < nums_size; i++) {
        nums[i] = i;
    }

    return 0;
}

(好吧,老實說。它開始很好,但很快就會進行交換。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM