个人见解,欢迎讨论。这其实源于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强大的垃圾回收机制。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。