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就是陣列的長度了 1.你可以設立一個指標intpointer 指標和陣列本來就是一家人 int intpointer 然後當取得了i的值後用 intpointer int malloc i sizeof int int main 用new 陣列長度給定後。如果想增加。只能重新分配空間。儲存元素,然後在進行刪除 用re... c語言中,同變數一樣 陣列也必須先定義後使用。一維陣列的定義形式 型別識別符號 陣列名 常量表示式 例如int a 10 其中a為地址常量。如變數的定義一樣,int a double a float a等 陣列的定義只是把後面的變數名改為陣列名而已。int a 10 就是定義了一個陣列名為a的陣列 ... 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 懂了嗎?三維甚至更多維大同小異,比...C 動態增加陣列長度,c 動態定義陣列長度
c語言中如何定義陣列C語言中如何定義陣列
用c語言動態三維陣列用C語言,動態三維陣列