1. 程式人生 > >C--關於函式形參和返回值的思考

C--關於函式形參和返回值的思考

關於函式形參和返回值的思考

前提

在呼叫Linux系統中的時間API介面時,仔細想想如何傳參以及接收返回值,寫程式碼執行的時候還是遇到了點問題,現在想通了好好梳理一番。Linux終端中使用man 2 timeman 3 ctime查詢後,可以得到很多相關內容,以下只取了三個函式,接下來開始分析。

time_t time(time_t *tloc);
char *ctime(const time_t *timep);
char *ctime_r(const time_t *timep, char *buf);

time函式

time_t *tloc型別是time_t 、輸出型引數,函式提供返回值,型別也是time_t 。time函式獲取時間值有三種方式:

time_t t;
time(&t);
time_t t;
t = time(NULL);
time_t t;
t = time(&t);

一臉懵逼的我還嘗試了這種方式:

time_t *pt;
time(pt);

結果:段錯誤 (核心已轉儲) 原因:指標沒有初始化就使用了!未初始化就使用很可能引起段錯誤,導致程式崩潰。指標未初始化它的值是不確定的,作為實參傳入函式的時候,函式內部並不會再給它分配空間去初始化!

ctime函式

const time_t *timep引數為輸入型引數,因為它加了const關鍵字。該函式內部動態申請記憶體用來儲存字串的值,並返回一個字元指標。ctime函式為不可重入函式

,不可重入含義是:不可重複進入,不可被並行呼叫,不可被中斷,依賴於任務環境,多工排程過程中資料可能會出錯。滿足了以下幾個特點多是不可重入函式:

  • 函式體內使用了靜態的資料結構;
  • 函式體內呼叫了malloc()或者free()函式;
  • 函式體內呼叫了標準I/O函式。

函式呼叫方法:

	time_t t;
	char *p;
	
	t = time(&t);
	p = ctime(&t);	 // here	
				
	printf("time: %s\n", p);

函式返回值直接定義指標就行了,p = ctime(&t);的作用是給指標初始化。

ctime_r函式

The four functions asctime()

, ctime(), gmtime() and localtime() return a pointer to static data and hence are not thread-safe. The thread-safe versions, asctime_r(), ctime_r(), gmtime_r() and localtime_r(), are specified by SUSv2. 根據man手冊可以看出,ctime_r是ctime的執行緒安全版本,同時也是可重入函式,關鍵修改在於函式形參,可以傳入陣列而不在函式內部申請。