2009年5月13日

C語言- 原來在function裡面回傳一個string只有兩種辦法

今天寫程式的時候發現一個問題: 要怎麼樣在C程式的function回傳一串文字? C程式回傳的東西只能是一個位址(char*), 程式像下面這樣寫的話

char* str_test(){
char a[20]="abcd";
return a;
}

會是嚴重的錯誤, 因為a是local var, 在離開str_test的時候就已經被free掉, 回傳的位址指向的東西將是一串無意義的東西。

所以只有兩種辦法可以做:

第一, 把a指向即使離開str_test也不會被free掉的地方, 就是heap區域, 注意: 但這需要用到heap區域的空間, 如果heap區域滿了, new指令也沒有用, 可能需要做new指令是否成功的檢查。

char* str_test(){

char* a= new char[20];
sprintf(a, "abcd");
return a;
}

第二, 直接把a指向的區域變成即使離開str_test也不會被release, 使用static指令, 但是這還是有點暴力。

char* str_test(){

static char a[20]= "abcd";
return a;
}

思考了一下, 最好的方式應該是把一個char*傳進去, 直接在function裡面更改指標指向的區域, function回傳void就好。

void str_test(char* result){
sprintf(result, "abcd");
//change result
}

雖然是很小的觀念, 但是影響很大, 指標的使用真的要很小心, 千萬不能讓指標指向的東西突然變成沒意義的東西。

ps. 雖說如此, c++的string卻可以做以下的事情:
#include

string str_test(){
string a="abcd";
return a;
}

改天要去找一下c++ STL的原始碼看看string是怎麼做的, 應該是多了不少個instruction作處理。

5 則留言:

  1. 寫得真好:) 幫了我大忙 謝謝你唷!!

    回覆刪除
  2. void str_test(char* result){...}

    這邊要很注意如果傳char*時,必須在傳遞前就得給記憶體空間,不然他沒地方放程式會有問題

    ex:

    void str_test(char* result){...}

    int main()
    {
    char *test = new char[5];
    str_test(test);
    }

    回覆刪除
  3. 感謝分享~~!
    這對我真的受益良多

    回覆刪除
  4. 作者已經移除這則留言。

    回覆刪除