標籤:style blog color 使用 ar strong for 資料 div
一、解決函數返回指標的幾種方法
1. 返回一個指向字串常量的指標。
例子:
char* func(){ rturn "Only work for simple strings";}
優點:簡單
缺點:如果你需要計算字串的內容,這種方法就無能為力了。如果以後需要修改返回的字串,你也會遇到麻煩!
2. 使用全域聲明的數組。
例子:
char my_global_array[255];char* func(){ my_global_array[0] = ‘0‘; return my_global_array;}
優點:適用於自己建立的字串,簡單易用。
缺點:任何人都有可能在任何時候修改這個全域數組,而且該函數的下一次調用也會覆蓋該數組的內容。
3. 使用靜態數組。
例子:
char* func(){ static char buff[20]; buff[0] = ‘0‘; return buff;}
優點:可以防止任何人都修改這個數組,只有擁有指向該數組的指標的函數(通過參數傳遞給它)才能修改這個靜態數組。
缺點:但是,該函數的下一次調用將覆蓋這個數組的內容,所以調用者必須在此之前使用或備份數組的內容。和全域資料一樣,大型緩衝區如果閑置不用是非常浪費記憶體空間的。
4. 顯式地分配一些記憶體,儲存返回的值。
例子:
char* func(){ char *s = malloc(120); ... return s;}
優點:這個方法具有靜態數組的優點,而且在每次調用時都建立一個新的緩衝區,所有該函數以後的調用不會覆蓋以前的傳回值。它適用於多線程的代碼。
缺點:程式員必須承擔起記憶體管理的責任。
5. 要求調用者分配記憶體類儲存函數的傳回值。程式員 malloc 和 free
例子:
void func(char* result, int size){ ... strncpy(result, "that‘d be in the data segment, Bob", size);}buffer = malloc(size);func(buffer, size);...free(buffer);
優點:記憶體管理比較輕鬆。
缺點:程式員還是需要自己管理記憶體,但是相比起第4種方法而言,malloc和free成對出現,管理記憶體會更方便。
二、關於聲明
2.1 一些不能
1. 函數的傳回值不能是一個函數;foo() ()是非法的。
2. 函數的傳回值不能是一個數組;foo()[0]是非法的。
3. 數組裡面不能有函數;foo[]()是非法的。
《C專家編程》之一