C語言中用動態陣列儲存長度未知的字串,應該怎麼使用malloc和realloc函式

2022-02-25 01:57:59 字數 5551 閱讀 8703

1樓:

char* buffer;

buffer = (char *)malloc(initialize size);

buffer = (char *)realloc(buffer, initialize size+add size);

一般做法是設定一個初始值,再設定一個追加值。

比如:*p初始分配10個字元空間。

當空間不夠用的時候,每次增加20個字元空間。這樣會增加效率。

象你這樣:初始p = (char *)malloc(10);

當判斷空間不夠用的時候,重分配:

p = (char*)realloc(p, 10+100*n++); //n做重分配次數計數器,初值=1

如果再不夠用,就再次呼叫:

p = (char*)realloc(p, 10+100*n++); //這時n=2了,n++後=3

2樓:new妞寧

這是以前我寫的**,字串存在buffer指標所在的緩衝區中int readbuffer(char **buffer)free(buftemp);//釋放

buffer[buf_totalcount-1]='\0'; //填充結束符

returnbuf_totalcount-1;//返回實際字串的長度

}希望對你有幫助

3樓:

我不懂c語言,等高人來解決

編寫一個linux c語言程式 接受輸入一個任意長度的字串並輸出(使用malloc和realloc函式)

c語言動態陣列,用malloc擴大後怎麼樣不改變原來的值,

4樓:匿名使用者

第一次申請動態記憶體使用malloc,然後擴大使用realloc就好了

c語言中動態記憶體分配函式的用法及作用?(比如malloc,calloc,realloc等)

5樓:風若遠去何人留

根據使用函式不同,作用各不相同。共同點均是動態分配一段記憶體,使用後需要用free函式釋放。所有動態分配函式均宣告在stdlib.h中。

1 malloc

void *malloc(unsigned int num_bytes);

功能分配長度為num_bytes位元組的記憶體塊

返回值如果分配成功則返回指向被分配記憶體的指標(此儲存區中的初始值不確定),否則返回空指標null。當記憶體不再使用時,應使用free()函式將記憶體塊釋放。函式返回的指標一定要適當對齊,使其可以用於任何資料物件。

說明關於該函式的原型,在以前malloc返回的是char型指標,新的ansic標準規定,該函式返回為void型指標,因此必要時要進行型別轉換。

2 calloc

void *calloc(size_t n, size_t size);

在記憶體的動態儲存區中分配n個長度為size的連續空間,函式返回一個指向分配起始地址的指標;如果分配不成功,返回null。

calloc在動態分配完記憶體後,自動初始化該記憶體空間為零,而malloc不初始化,裡邊資料是隨機的垃圾資料。

3 realloc

void *realloc(void *mem_address, unsigned int newsize);

功能先判斷當前的指標是否有足夠的連續空間,如果有,擴大mem_address指向的地址,並且將mem_address返回,如果空間不夠,先按照newsize指定的大小分配空間,將原有資料從頭到尾拷貝到新分配的記憶體區域,而後釋放原來mem_address所指記憶體區域(注意:原來指標是自動釋放,不需要使用free),同時返回新分配的記憶體區域的首地址。即重新分配儲存器塊的地址。

返回值如果重新分配成功則返回指向被分配記憶體的指標,否則返回空指標null。

注意當記憶體不再使用時,應使用free()函式將記憶體塊釋放。

6樓:

先舉個例子:某使用者需要一個將任意多個整數按大小排序的程式。(在計算機資料夾中,當檔案很多時經常用到排序)

1。若不用動態分配記憶體,那就定義一個超大的陣列吧!問題是,如果使用者不需要那麼大,不就浪費了?如果定義的陣列還不夠大,不就不能滿足需求了?

2。如果用動態分配,就解決上述問題了。當你需要多大記憶體時,就給你多大——如果有的話——這就是動態分配的意義。

現在看上述問題的**,我除錯過的:

#include

#include /* calloc、exit需要宣告標頭檔案 */

void main()

printf("請輸入這些整數:\n");

for(i=0;i*(p+j+1))

}printf("將這些整數從小到大排列輸出為:");

for(i=0;i

printf("\n");

free(p); /* 釋放空間 */

呼叫calloc函式時,calloc(n,sizeof(int))表示請求n個連續的、每個長度為整型的空間,若成功返回這些空間的首地址。(int *)表示將這個地址放在指標中。到此為止,就可以用指標來對分配到的空間操作了。

注意,最後一定要用free函式釋放申請到的空間,否則這部分空間會一直佔著。

malloc、calloc、realloc的用法(以上述問題為例)及區別:

1。malloc(n*sizeof(int)) /* 請求n個連續的、每個長度為整型的空間,若成功返回這些空間的首地址,失敗返回0 */

2。calloc(n,sizeof(int)) /* 請求n個連續的、每個長度為整型的空間,若成功返回這些空間的首地址並將每個空間賦值為0,失敗返回0 */

3。realloc(p,sizeof(int)*n) /* 給一個已經分配了地址的指標重新分配空間,引數p為原有的空間地址,sizeof(int)*n是重新申請的地址長度,用於分配不足的時候。個人覺得沒用——不夠就找到原分配處改大一點不就行了?!

*/我能說得只有這些了,有些東西看起來麻煩,當你小試一下就會發現,不過如此嘛!學c要多練、多思,不怕麻煩。不知道您學了遞迴沒有?

有個經典的「漢諾塔」問題,那傢伙——得整死人啊!到現在我還一知半解的……

希望我的回答對您有幫助!

7樓:哈哈哈好的哈哈哈哈哈哈哈哈哈哈哈哈好哈哈

你還是自己檢視下malloc()的原函式吧,可能理解好點

8樓:速心

動態記憶體分配是用於處理預先不知道資料量大小的問題

9樓:杯具的

還是多看看書吧~估計解釋了你也不會明白

怎麼用c語言定義一個無限長的陣列?

10樓:風若遠去何人留

c語言支援定義一個不顯式定義長度的陣列,即通過初始化資料來分配陣列長度。

比如int a = ; 陣列a的長度沒有顯式給出,由於有5個初始化資料,所以分配空間長度為5個int型。

但是無論如何定義,陣列的長度都是固定的,在定義的時候就已經分配好空間,從這個角度上c語言無法定義無限長的陣列。但很多實際應用中又事先無法確定陣列的長度,對於這類情況,一般有兩種方法可以使用。

1 由malloc和realloc兩個函式,分配動態空間,隨時按需改變陣列的最大長度。

通過下面例子來理解該方法:

#include

#include

int main()}}

if(a) free(a);//對申請的記憶體進行釋放。

return 0;

}從以上程式可以看到,這種方式的原理就是每當陣列空間不足時,利用函式realloc分配一段新的記憶體空間以增大陣列長度。 直到佔滿所有剩餘空間。

如果到佔滿所有空間還是無法存下資料,那麼是硬體無法支援了。

所以這種方法可以做到軟體意義上的無限大陣列空間。

但是這種方法**量比較大,而且需要頻繁的進行記憶體的分配,如果實現知道資料的最大可能規模,那麼可以用另一個方法。

2 事先知道資料的最大規模,比如統計一個班的分數時,一個班最多不超過百人,那麼可以直接定義一個長度為100的陣列,或者保險起見,定義一個長度為1000的陣列,並對其操作。這樣在操作範圍內,這個就是一個「無限長」的陣列了。

11樓:

計算機的記憶體是有限的,所以不可能定義一個無限長的陣列。

我們可以定義動態陣列(長度可變),用malloc 動態分配單元,用 realloc 增加和再分配單元。並測定分配是否成功。記憶體不夠使用時就會分配失敗。

詳細見 malloc,realloc 幫助檔案。

12樓:魔龍嗜血

你可以使用動態開闢空間的方法實現,也就是malloc與calloc函式的方法實現。

int *p=(int *)malloc(sizeof (int));

根據需求開闢適當的空間。

13樓:匿名使用者

定義陣列必須規定多大的,確定的,無限大這個不行

c語言 陣列未知個數 怎麼宣告

14樓:一棵無所不知的小白菜

1、首先,我們編寫標頭檔案以及main函式主框架。

2、然後我們編寫語句,int可更改為任意其他型別。

3、接下來我們可以for語句給他賦值。

4、為了方便測試,我們可以將其輸出。

5、然後我們點選編譯執行按鈕。

6、這個時候我們便可以看到效果,即可得到陣列個數申明。

15樓:風若遠去何人留

c語言在陣列個數未知的情況下,根據應用情況不同,有三種方式。

1,陣列元素總數未知,但是需要儲存的內容是已知的。

其實這是一種變相的已知個數,只是程式設計者不去計算總個數,把這個工作交給系統來做。這時可以通過陣列個數留空,顯式初始化陣列進行宣告。

比如char s = "this is a test string";

就是初始化了這樣一個陣列s,其空間個數隱式的由初始化字串決定。

2,陣列元素總數未知,但最大規模已知。

比如不知道陣列的總個數,但是確定不會超過100個,那麼就可以定義一個100個元素的陣列,供儲存呼叫。

3,動態分配陣列。

通過malloc函式,可以動態的分配陣列,然後記錄下當前分配的陣列元素個數,並使用該陣列。當陣列空間不足時,可以通過realloc函式,重新分配空間,擴大陣列元素個數。

比如int size = 100;

int *p = (int *)malloc(sizeof(int) * 100); // 初始化分配100個元素空間。用size儲存當前陣列規模。

p = realloc(sizeof(int)*(size + 100), p);//當空間不足時,增加100個元素。

size+=100;//需要注意的是,必須同步維護size的大小,否則會出錯。

16樓:匿名使用者

可以通過sizeof函式先求出陣列的長度,例如:

int a[50];

int len = sizeof(a)/sizeof(a[0]);

那麼len就是陣列的長度了

C 動態增加陣列長度,c 動態定義陣列長度

1.你可以設立一個指標intpointer 指標和陣列本來就是一家人 int intpointer 然後當取得了i的值後用 intpointer int malloc i sizeof int int main 用new 陣列長度給定後。如果想增加。只能重新分配空間。儲存元素,然後在進行刪除 用re...

c語言中如何定義陣列C語言中如何定義陣列

c語言中,同變數一樣 陣列也必須先定義後使用。一維陣列的定義形式 型別識別符號 陣列名 常量表示式 例如int a 10 其中a為地址常量。如變數的定義一樣,int a double a float a等 陣列的定義只是把後面的變數名改為陣列名而已。int a 10 就是定義了一個陣列名為a的陣列 ...

用c語言動態三維陣列用C語言,動態三維陣列

1 先說二維,可以這麼理解 int n 3 有3個int 那麼,int m 5 3 有5個int 3 賦值時 n 1 3把3給1號 m 4 m 4 是個int 3 型別,這麼賦值,也就是這麼賦值 m 4 的 0 是5 m 4 0 5 m 4 1 9 m 4 2 4 懂了嗎?三維甚至更多維大同小異,比...