我有一種情況,我希望我的程序能夠讀取一些數字來定義二維數組的大小(用作矩陣)。我原本認爲,要做到這一點的唯一方法是使用一個malloc
調用把陣列上堆,是這樣的:可以使用一個變量來定義棧中數組的大小c?
matrixElement* matrix = malloc(sizeof(matrixElement) * numRows * numCols);
其中數numCols和numRows行爲進行了早期閱讀的整數, matrixElement是一些任意類型。我的理由是,簡單地寫:
matrixElement matrix[numRows][numCols];
是行不通的,因爲編譯器將無法知道多少堆棧空間分配給函數調用的方式。事實證明,我錯了,因爲下面的代碼編譯和運行:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int x, y;
scanf("%d", &x);
scanf("%d", &y);
double arr[x][y];
printf("Made an array of size %d by %d, total memory %fKb\n",
sizeof(arr)/sizeof(arr[0]),
sizeof(arr[0])/sizeof(arr[0][0]),
(float) sizeof(arr)/1024.0f);
return 0;
}
有了很大的輸入x和y的足夠多,這最終會給出一個段錯誤,但我也希望看到,我可以創造非常驚訝帶有此代碼的1000x1000陣列。
任何人都可以解釋這裏發生了什麼?
是編譯器只是分配一堆空間爲陣,即使它不知道有多少會用嗎?
是由ANSI C指定此行爲或只是一些海灣合作委員會在其自身在做什麼?
但請注意,對此的支持很不明顯。即使在GCC試圖支持它一段時間,它顯然是甚至到4.3版本(http://gcc.gnu.org/gcc-4.3/c99status.html) – 2009-11-02 19:06:21
+1,是絕對正確的。這可能是C99中最有爭議的一個。 – 2009-11-02 19:07:01
請注意,你的堆棧通常比你的堆小得多。如果你想動態調整任何實際大小的數組,使用malloc()可能是一個好主意。還要記住,像所有本地(非靜態)對象一樣,這些數組一旦你的函數返回就會消失。 – 2009-11-02 19:15:43