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作處理。
寫得真好:) 幫了我大忙 謝謝你唷!!
回覆刪除void str_test(char* result){...}
回覆刪除這邊要很注意如果傳char*時,必須在傳遞前就得給記憶體空間,不然他沒地方放程式會有問題
ex:
void str_test(char* result){...}
int main()
{
char *test = new char[5];
str_test(test);
}
感謝分享~~!
回覆刪除這對我真的受益良多
^^ 有幫到真是太好囉
刪除作者已經移除這則留言。
回覆刪除