個人見解,歡迎討論。這其實源於c/c++需要自己管理記憶體,而一個好的慣例是
自己申請的記憶體要自己釋放掉
所以c/c++庫函式一般都不會返回指標,你會說有些函式返回指標了呀,如
char *strcpy (char * __dest, const char * __src);
但實際返回的是你傳入的__dest
,記憶體還是你申請的
另外像一些用c實現的容器會返回指標,比如我們自己實現一個stack可以這樣
typedef struct Stack_T *Stack_T;
void Stack_push(Stack_T stk, void *x);
void *Stack_pop(Stack_T stk);
但事實上pop出來的void *
仍然是你自己push進去的,這個stack並不會幫你生成一個*x
的copy,它只存你給它的指標而不是實際的變數。所以這個stack只用自己管理自己的記憶體,它的記憶體操作是隱藏在函式內部的,與push和pop對應。
順便說一下c++庫中stack,和上面這個c版本的有點不太一樣,因為c++裡存的是變數的值。它的top
會返回一個引用即指標,這個指標對應的記憶體並不是使用者自己申請的,而是在push的時候stack幫你申請的,pop對應地會釋放掉它。所以它的top
和pop
是分開的,否則會產生懸掛指標。
回到c庫中為什麼沒有itoa
,正是因為庫函式不能幫你申請一塊記憶體,也就無法返回一個字串。你說我們可以自己申請記憶體讓庫函式把字串寫進去。事實上,sprintf
已經做了這個工作。幸運的是,c++11中增加了to_string
的函式,我們再也不用自己申請記憶體再用sprintf
了。
c++也是一樣,庫函式的返回不能是一個陣列(即指標),所以split
之後被分開來的多個字串就無法返回。用vector
或者array
是可以的,但庫中不應該存在這樣的依賴關係,即string不應該依賴vector。而在java中,String.split
返回的正是一個陣列(即指標),這依賴於java強大的垃圾回收機制。