簡體   English   中英

C語言中靜態數組與非靜態數組的區別

[英]Difference between static and non-static array in C

我想知道為什么這可以達到1e8的大小。 對於大於1e8的大小,編譯器會說“大小太大”。

#include <stdio.h>
int main() {
    printf("allocating...\n");
    static float m[(int)1e8];
    printf("done\n");
}

雖然這僅適用於1e5。 如果將size設置為1e6,它可以正常編譯,但是即使在打印第一行之前,運行時也會崩潰。

#include <stdio.h>
int main() {
    printf("allocating...\n");
    float m[(int)1e5];
    printf("done\n");
}

這些限制是什么? 以及為什么static有更高的限制?


編輯:平台是Windows7中的MinGW64。 尚未在linux中測試過。

用C表示,具有靜態存儲持續時間的對象在程序的整個執行時間內都有效,而具有自動存儲持續時間(這是函數范圍中的默認值)的對象僅存在於其范圍內。 直接的結果是,您將永遠只有一個靜態版本的實例,而每次調用該函數都會創建一個自動對象。 C沒有任何關於大小限制的說明。

但是,當然有一個簡單的解釋:大多數C的實現都使用堆棧來存儲自動變量。 每個函數調用都有自己的堆棧框架 ,因此可以確保每個函數都使用其自己的“局部變量”實例。 操作系統限制了堆棧的總大小,這就是您要達到的極限。 另一方面,具有靜態存儲持續時間的對象直接在您的可執行文件中定義,該內存將在過程開始時從OS中獲取。

靜態聲明通常在程序啟動后立即分配,並且只要程序運行就一直分配,而非靜態聲明通常存儲在堆棧中,並且在函數終止時可以重新使用。 這可能就是為什么這兩種分配行為不同的原因。

我想說的是,在第二種情況下,程序崩潰的事實與操作系統處理堆棧的方式有關。 但是我不確定

暫無
暫無

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

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