簡體   English   中英

為什么在我可以定義一個可變長度數組時使用malloc()?

[英]Why use malloc() when I can just define a variable-length array?

我正在閱讀有關在C中動態創建數組的信息。所以正如我所描述的那樣:

int n;
scanf("%d", &n);
int *arr = (int*)malloc(n*sizeof(int));

但后來我想如果我能做這樣的事 -

int n, i, sum=0;
scanf("%d", &n);
int arr[n];

我編譯並運行它沒有任何錯誤。 所以,我的問題是為什么我應該使用malloc() 這是否與舊版和新版C有關?

在可變長度數組上使用malloc至少有五個好處。

  1. 最值得注意的是,在執行當前塊結束后,使用malloc創建的對象仍然存在。 這意味着可以將這些對象(通過指針)返回給函數的調用者。 這種用法在實際應用中很常見。 當塊的執行結束時,作為可變長度數組創建的數組不再存在。

  2. 使用malloc創建的數組可以使用realloc調整大小。 無法調整可變長度數組的大小。

  3. 從2011 C標准開始,可變長度數組對於C實現來說是可選的。 任何質量的通用C實現都會支持它們,但它們是可選的這一事實意味着可移植的代碼必須不使用可變長度數組,或者必須通過測試預處理器宏__STDC_NO_VLA__防止缺乏支持。提供替代代碼。

  4. 通常,可變長度數組的大小比使用malloc分配的數組要大得多。 可變長度數組通常使用堆棧空間來實現,並且堆棧通常限於某些不大量的mebibytes(盡管在構建可執行文件時通常可以增加)。 對於使用malloc創建的對象,可以在現代系統中使用gibibytes內存。

  5. 如果使用malloc創建數組失敗,則返回NULL ,程序員可以輕松編寫代碼來檢測並處理它。 如果創建可變長度數組失敗,則通常的行為是操作系統終止程序時出現一些內存錯誤。 (各種C實現可能提供攔截此錯誤的方法,但它比測試NULLmalloc返回值更令人討厭,並且它不可移植。)

我編譯並運行它沒有任何錯誤。 所以,我的問題是為什么我應該真的使用malloc()? 這是否與舊版和新版C有關?

堆棧分配的數組不等同於自由存儲中的緩沖區(堆, malloccalloc使用的內存區域)。

  1. 假設數組存在於堆棧中(隱含為自動變量),那么您的數組不能超過平台的最大堆棧大小。 在使用pthreads的Linux上,默認值為2兆字節。 Windows上的限制類似。

  2. 由於范圍和對象的生命周期:指向堆棧中存在的數組中元素的指針不能比它們指向的數組長壽命,這意味着在它們在expires中聲明的范圍之后,您不能返回指向這些數組和元素的指針。

  3. VLA陣列在C11中是可選的。 在C ++中,它們根本不是規范的一部分(即它們是供應商擴展),因此您的代碼將不可移植。

暫無
暫無

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

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