<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
有時,您可能會碰到這樣的情況,您希望函數帶有可變數量的引數,而不是預定義數量的引數。C 語言為這種情況提供了一個解決方案,它允許您定義一個函數,能根據具體的需求接受可變數量的引數。下面的範例演示了這種函數的定義。
int func(int, ... ) { . . . } int main() { func(2, 2, 3); func(3, 2, 3, 4); }
請注意,函數func()最後一個引數寫成省略號,即三個點號(...),省略號之前的那個引數是int,代表了要傳遞的可變引數的總數。為了使用這個功能,您需要使用stdarg.h標頭檔案,該檔案提供了實現可變引數功能的函數和宏。具體步驟如下:
現在讓我們按照上面的步驟,來編寫一個帶有可變數量引數的函數,並返回它們的平均值:
#include <stdio.h> #include <stdarg.h> double average(int num,...) { va_list valist; double sum = 0.0; int i; /* 為 num 個引數初始化 valist */ va_start(valist, num); /* 存取所有賦給 valist 的引數 */ for (i = 0; i < num; i++) { sum += va_arg(valist, int); } /* 清理為 valist 保留的記憶體 */ va_end(valist); return sum/num; } int main() { printf("Average of 2, 3, 4, 5 = %fn", average(4, 2,3,4,5)); printf("Average of 5, 10, 15 = %fn", average(3, 5,10,15)); }
當上面的程式碼被編譯和執行時,它會產生下列結果。應該指出的是,函數average()被呼叫兩次,每次第一個引數都是表示被傳的可變引數的總數。省略號被用來傳遞可變數量的引數。
Average of 2, 3, 4, 5 = 3.500000 Average of 5, 10, 15 = 10.000000
C 語言為記憶體的分配和管理提供了幾個函數。這些函數可以在<stdlib.h>標頭檔案中找到。
注意:void * 型別表示未確定型別的指標。C、C++ 規定 void * 型別可以通過型別轉換強制轉換為任何其它型別的指標。
程式設計時,如果您預先知道陣列的大小,那麼定義陣列時就比較容易。例如,一個儲存人名的陣列,它最多容納 100 個字元,所以您可以定義陣列,如下所示:
char name[100];
但是,如果您預先不知道需要儲存的文字長度,例如您想儲存有關一個主題的詳細描述。在這裡,我們需要定義一個指標,該指標指向未定義所需記憶體大小的字元,後續再根據需求來分配記憶體,如下所示:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char name[100]; char *description; strcpy(name, "Zara Ali"); /* 動態分配記憶體 */ description = (char *)malloc( 200 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memoryn"); } else { strcpy( description, "Zara ali a DPS student in class 10th"); } printf("Name = %sn", name ); printf("Description: %sn", description ); }
當上面的程式碼被編譯和執行時,它會產生下列結果:
Name = Zara Ali
Description: Zara ali a DPS student in class 10th
上面的程式也可以使用calloc()來編寫,只需要把 malloc 替換為 calloc 即可,如下所示:
calloc(200, sizeof(char));
當動態分配記憶體時,您有完全控制權,可以傳遞任何大小的值。而那些預先定義了大小的陣列,一旦定義則無法改變大小。
當程式退出時,作業系統會自動釋放所有分配給程式的記憶體,但是,建議您在不需要記憶體時,都應該呼叫函數free()來釋放記憶體。
或者,您可以通過呼叫函數realloc()來增加或減少已分配的記憶體塊的大小。讓我們使用 realloc() 和 free() 函數,再次檢視上面的範例:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char name[100]; char *description; strcpy(name, "Zara Ali"); /* 動態分配記憶體 */ description = (char *)malloc( 30 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memoryn"); } else { strcpy( description, "Zara ali a DPS student."); } /* 假設您想要儲存更大的描述資訊 */ description = (char *) realloc( description, 100 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memoryn"); } else { strcat( description, "She is in class 10th"); } printf("Name = %sn", name ); printf("Description: %sn", description ); /* 使用 free() 函數釋放記憶體 */ free(description); }
當上面的程式碼被編譯和執行時,它會產生下列結果:
Name = Zara Ali
Description: Zara ali a DPS student.She is in class 10th
您可以嘗試一下不重新分配額外的記憶體,strcat() 函數會生成一個錯誤,因為儲存 description 時可用的記憶體不足。
到此這篇關於C語言可變引數與記憶體管理超詳細講解的文章就介紹到這了,更多相關C語言可變引數 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45