我有這樣的代碼這實際上是動態內存分配嗎?
int e;
scanf("%d",&e);
int ar[e];
這是動態分配?它看起來像是我可以在運行時分配內存。
我用它從用戶獲取輸入的元素數量,然後再由用戶填充它。
我有這樣的代碼這實際上是動態內存分配嗎?
int e;
scanf("%d",&e);
int ar[e];
這是動態分配?它看起來像是我可以在運行時分配內存。
我用它從用戶獲取輸入的元素數量,然後再由用戶填充它。
這不是正好是動態內存分配,正如通常所理解的術語。
這叫做variable length array。數組的大小在運行時是已知的,因此在運行時分配內存。然而,與動態內存分配庫函數(malloc()
/calloc()
)不同,底層內存分配是依賴於編譯器的。例如,gcc
分配堆棧中的VLA。因此,這種方法的主要區別(與動態內存分配相比)是,VLA駐留在自動存儲器中。一旦你離開示波器,它將不再可用。引用C11
,章第6.2.4節
對於這樣的對象,它具有可變長度數組類型,它的壽命從 直到程序的執行離開 聲明的範圍擴展的對象的聲明。 [...]
FWIW,這是在C99
標準中引入的,只有在C11
中才可選。
而AFAIK,C++
不支持這個作爲標準的組成部分,它可能是一個編譯器擴展。
int ar[e]
是堆棧分配的VLA(可變長度數組),它在C++中無效,但在C99中有效。塊結束時,它將自動彈出(釋放)。
雖然內存在這種情況下,在運行時分配的,它是不完全動態內存分配。請記住,動態分配的內存應該在其使用後釋放/釋放。
這應該是這樣的(C)中
int e;
scanf("%d", &e);
/*dynamically allocate memory using malloc function*/
int* ar = (int*) malloc(e * sizeof(int));
...
...
...
/* release memory using free() function */
free(ar);
C或C++?選擇一個。 –
根據C++標準,你的代碼是不合格的,但在C99中是合法的。這兩種語言*非常*不同。 – kfsone