回复 20楼 liu0919
我对调用函数 就是比如 int *(int h)我在书上看到过,不过对加了*调用就不会了
11樓代碼子函數的意圖,是對外部數據a賦值,并返回a自身。這個函數使用了strcpy()複製數據,但沒有限定目標空間的尺寸,當t的數據量比a(函數中的source其實就是上層的a)多時,就會溢出(strcpy()函數本來就是應被廢棄的庫函數)。這還是小問題,那代碼最大的問題,在於誤導調用者main()以爲函數test()真的分配并返回了一個字符串給自己,而沒意識實際上是自己的a字符串被使用,在main()函數中,那個a[]數組看起來被廢棄了,它僅僅把初始化了a[]送給函數test()而已,卻沒有跡象顯示test()會修改a[]的内容,這不僅僅是代碼不清晰,還是誤導性的,當閲讀者看不到test()的實現代碼時,就會莫明其妙。較爲好點的寫法,是這樣:
程序代码:
#include <cstdio> #include <cstring> void test(char* source, int size); int main(int argc, char* argv[]) { char a[100]; test(a, sizeof(a) - 1); // 很明確這將會修改a的内容,而且不需對a初始化 printf("%s\n", a); // 明確使用的是a,不是test()產生的字符串,test()祇是負責給a[]賦值而已 return 0; } void test(char* source, int size) { char t[]="这个准备返回给主函数"; strncpy(source, t, size); }
不讓test()返回字符指針,是刻意而爲,目的就是避免前述誤導效應,除非設計test()用返回結果標識錯誤狀態,即使是後者,也應使用邏輯型或數值型返回值,不用指針(NULL)。
用char* test()聲明返回字符指針,可能誤導調用者以爲char* p = test(a)也是可以的,似乎test()會給指針p分配内存,實際上沒有,但用我現在這種寫法,你絕不會在沒對char* p分配空間的情況下就調用test(p),因爲在本代碼段就已經看出問題了。也不推薦在test()中用malloc()給指針型參數分配空間然後返回,調用者并不覺得他有free(p)的義務,畢竟不是他malloc()的,那種用法還有更深層的隱患,在多次調用test()的時候就很容易出現内存泄漏了。
[ 本帖最后由 TonyDeng 于 2014-1-2 20:21 编辑 ]