c語言malloc不能定義全域性陣列嗎

2025-07-18 06:30:21 字數 3884 閱讀 1204

大陣列定義在main函式中不能執行,為什麼將其定義為全域性變數就可以執行?

1樓:之凱澤

陣列定義在函式中時,佔用的記憶體來自棧空間,棧空間是在程序建立時初始化的,有固定的大小,一般為幾十kb,所以太大的陣列會耗光棧空間。

而全域性變數佔用的堆空間,堆空間中的記憶體是按需分配,自由增長的,可以非常大,32位的系統中可以大到4gb。

樓下說得對,我記錯了。堆空間是malloc()的。

全域性變數是在編譯的時候編到資料段的,可以比較大。

2樓:網友

前半部分同意,後半部分樓上說的有點問題,全域性變數一般分配在資料段。

c語言用malloc定義二維陣列問題

3樓:難_再_續

p是乙個指向指標的指標,在上例中,你用malloc函式開闢的一段記憶體賦給了p,簡單的理解,其實p就是乙個陣列(以下我稱為p陣列),不過陣列中存放的都是指標,即p是乙個指標陣列,陣列中存放了5個指向int型的指標,你知道乙個普通的陣列可用它的陣列名進行訪問例如:a[5]就可用*a訪問其第乙個元素。

同理用*p就可訪問p陣列的第乙個元素,*p+1訪問第二個元素,以此類推,而*p中存放的又是乙個指標,所以**p就可以指向乙個整形資料。

4樓:網友

首先要理解。

int* ptr = (int*)malloc(5 * sizeof(int));// 動態分配5個整型的記憶體空間,跟int a[5]相似,但前者是堆上分配的,後者是棧上分配的。

p=(int **malloc(sizeof(int*)*5); // 意思就是定義乙個有5個int型別的指標的動態陣列,然後在裡面存放指標。

p[i] 其實就是乙個指標。

p[i]=(int *)malloc(sizeof(int)*5); // 給該指標分配記憶體。

不知道這樣是否能讓你明白,不明白可追問。

5樓:網友

位址資料就是乙個long型別的資料。一般在32位機上long 和int 佔一樣的空間,都是四個位元組。

指標變數是用來儲存位址的。也就是說,變數的值是個位址值,是個整型數!

因此,指標分配空間按整型型別分配空間就可以了!

關於指標的資料型別,那是為儲存和訪問位址中的資料準備的。

main()}

c語言「堆」申請為什麼用malloc函式,用陣列不行嗎?

6樓:網友

在所需記憶體大小已知的時候也可以用陣列申請,malloc函式用在其大小在執行時才確定的情況,此時就無法用陣列來做了。

堆是用來存放資料的,使用堆為了讓cpu可以找到相應的資料,如果自由分配,cpu無法確定這是程式還是資料,是什麼型別的資料。

7樓:網友

這個涉及兩個儲存區域,堆和棧,你用malloc申請的空間在堆上,char a[10]這個是在棧上。

堆和棧最重要乙個區別是,棧是系統管理的的,他負責**和釋放,所以有個概念叫作用域,變數的作用域一結束,棧就**變數的資源。但是堆是程式設計師管理的,你不釋放,除非程序結束,這個空間就一直在那,就有了一定靈活性。

堆在實現的時候確實是在底層是連結串列的形式沒錯,棧是連續的空間。

c語言中可不可以用變數定義陣列的個數

8樓:網友

陣列不可以, 但是有變通的方法。

int n;

scanf("%d",&n);

int *s;

s=(int*)malloc(sizeof(int)*n);

相當用定義了乙個長度為n的int陣列,呼叫和陣列一樣,s[0],s[1]..

9樓:練芙函千秋

原因如下:

由於陣列在定義的時候,系統就會分配對應的儲存單元,如果用變數,系統就不知道該分配多少位元組的儲存單元,就會報錯。

但是可以用巨集定義定義的常量定義陣列個數,因為巨集定義是在編譯階段進行字元替換的,所以滿足陣列預先分配儲存單元的要求。

10樓:瀧喬樂正飛翮

陣列的成員個數不可以用變數定義。

但可以這樣,在void

main()前加#define

n100,再定義陣列a[n],這樣可以。

c語言用malloc函式定義陣列

11樓:一流退堂鼓手

int* arr;

int n = 5;

arr = (int*)malloc(n*sizeof(int));

然後就定義好了呀,這就是你需要的那種malloc分配空間的陣列,使用結束需要釋放掉,free(arr)。

c語言中malloc和靜態陣列最多能開到多大呢

12樓:風若遠去何人留

取決於物理系統剩餘記憶體大小。

在c語言中,malloc動態開闢的空間,以及靜態陣列均是佔用堆上的記憶體的。

而系統堆記憶體是與程序無關的,堆記憶體的剩餘量,就是系統記憶體的剩餘量,包括實體記憶體和虛擬記憶體。

所以,只要系統記憶體剩餘有多大,那麼malloc和靜態陣列就可以開多大。

不過,由於系統記憶體剩餘量並非固定,而是由系統執行實際情況決定的,所以在程式設計中,一般不會使用過大的靜態陣列,或動態記憶體,以免出現執行不穩定的問題。

13樓:看見什麼吃什麼

其實malloc函式來說的話,應該是能開到 剩餘記憶體+虛擬記憶體的大小。但是你一般不需要用到這麼大的記憶體,所以用malloc函式而言是絕對足夠的。

另外c的話靜態陣列一般是1000000*int 位元組。主要看你係統的記憶體環節。

14樓:網友

靜態陣列最多能開到2k位元組,相當於1024個整數。

malloc開闢的動態陣列容量則與機器的記憶體總容量和當前佔用的記憶體容量有關係。

其實靜態陣列和動態陣列都要佔用記憶體,只是靜態陣列佔用的是程式的棧區,棧區一般只有2kb,而動態陣列則沒有容量限制,但是已經佔用的記憶體不能開闢動態空間。

15樓:金色潛鳥

語法上沒有規定最大。

計算機用虛擬儲存,也就是儲存器裡ram裡放不下時,就寫到磁碟裡去,要用的資料塊從磁碟裡讀進來,不用的資料塊,放到盤裡。利用倒進倒出,多大的陣列都可以,只是程式執行效率變低了。

三維圖形動態顯示,常要很大的陣列,高效率的顯示卡(硬體)會帶額外的ram。

理論上說,只要不超過硬體許可,開多大都可以。實際上,有限制。

我的計算機,這個可以:

#include

int a[1000000]; // 全域性量,允許比較大的陣列int main()

若int a[1000000]; 放到main()裡,就不行了。

-c語言無符號整型數有最大限制,所以乙個維的大小,不能超過整型數最大限制。

malloc 動態分配,可以測定,分配是否成功。

如何定義乙個未定義大小的全域性變數陣列?

16樓:網友

#include

#include // for malloc()#include

int **array; // 在所有**塊之外宣告int main()

printf("");

return 0;}

17樓:業秀竹

你最起碼得說明白你用什麼語言吧……

用c的話用malloc分配。

c++的話就用new

18樓:網友

第一 把陣列開大點= =要用多少到時候再說。

第二 vector是個好東西,變長陣列。

以上為c++stl模板。

C語言char和malloc的使用

char 是一個copy指向char 的指標,char 是指向char的指標。在函式中如果要對一個引數char 申請空間,同時要在函式外面使用時 需要傳遞char 否則申請的空間無法在函式外面使用,但申請的空間仍會在,造成空間洩露。申請空間可以用malloc向系統申請分配指定size個位元組的記憶體...

乙個關於C語言裡面 MALLOC函式的問題

malloc 的意思是分配記憶體舉個例子。char p char malloc 就是分配個位元組長度的 char 型別記憶體。釋放的時候要這樣寫。free p p null free 的意思是釋放掉 malloc 開闢的記憶體悄吵,但是為了防止野指標 所謂野指標是程式編寫的時候的乙個絕灶疏忽造成的bug,野...

c語言中巨集替換與定義全域性變數的區別是什麼

全域性變數 是可以在程式中任何地方使用 而且是可以修改的 巨集定義也可以在任何地方使用 但是不能在之後修改 資料型別沒有限制的 巨集定義不分配記憶體,全域性變數定義分配記憶體。巨集定義的值在程式中是不能改變的,只是巨集替換,全域性變數的值是可以在程式中更改的。巨集定義不存在型別問題,它的引數也是無型...