1.可變引數(variable arguments):
可變引數允許您定義一個函式,能根據具體的需求接受可變數量的引數,
int func(int, ... ) (函式 func() 最后一個引數寫成省略號,即三個點號(...),省略號之前的那個引數是 int,代表了要傳遞的可變引數的總數,)
{
. . .
}
呼叫的話:
func(2, 2, 3);
func(3, 2, 3, 4);
為了實作這些功能,使用 stdarg.h 頭檔案,該檔案提供了實作可變引數功能的函式和宏,
操作:
a.創建一個 va_list 型別變數,然后使用 int 引數和 va_start 宏來初始化 va_list 變數為一個引數串列,
b.使用 va_arg 宏和 va_list 變數來訪問引數串列中的每個項,
c.使用宏 va_end 來清理賦予 va_list 變數的記憶體,
2.淺談記憶體管理:
a.常用函式:
<stdlib.h> 頭檔案里為記憶體管理提供了幾個函式,
void *calloc(int num, int size); (在記憶體中動態地分配 num 個長度為 size 的連續空間,并將每一個位元組都初始化為 0,所以它的結果是分配了 num*size 個位元組長度的記憶體空間,并且每個位元組的值都是0,)
void free(void *address); (該函式釋放 address 所指向的記憶體塊,釋放的是動態分配的記憶體空間,)
void *malloc(int num); (在堆區分配一塊指定大小的記憶體空間,用來存放資料,這塊記憶體空間在函式執行完成后不會被初始化,它們的值是未知的,)
void *realloc(void *address, int newsize); (該函式重新分配記憶體,把記憶體擴展到 newsize)
sub: void * 型別表示未確定型別的指標,C、C++ 規定 void * 型別可以通過型別轉換強制轉換為任何其它型別的指標,關于void還有更多的資料:https://www.runoob.com/w3cnote/c-void-intro.html
b.動態分配記憶體:
編程時,如果您預先知道陣列的大小,那么定義陣列時就比較容易,例如,一個存盤人名的陣列,它最多容納 100 個字符,所以您可以定義陣列.
但是,如果您預先不知道需要存盤的文本長度,例如您向存盤有關一個主題的詳細描述,在這里,我們需要定義一個指標,該指標指向未定義所需記憶體大小的字符,后續再根據需求來分配記憶體.
假如我們需要分配能儲存200個char size的記憶體空間: description = (char *)malloc( 200 * sizeof(char) );
sub:之所以要動態分配,是因為當動態分配記憶體時,您有完全控制權,可以傳遞任何大小的值,而那些預先定義了大小的陣列,一旦定義則無法改變大小,
c.釋放和調整記憶體:
當程式退出時,作業系統會自動釋放所有分配給程式的記憶體,但是,建議您在不需要記憶體時,都應該呼叫函式 free() 來釋放記憶體,
或者,您可以通過呼叫函式 realloc() 來增加或減少已分配的記憶體塊的大小,
description = (char *)malloc( 30 * sizeof(char) ); (初始分配)
description = (char *) realloc( description, 100 * sizeof(char) ); (分配更大的記憶體)
參考:https://www.runoob.com/cprogramming/c-variable-arguments.html
https://www.runoob.com/cprogramming/c-memory-management.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/61766.html
標籤:C
