今天在網上看到一道求助的題目,是關於指標作為函式引數的問題,讓我不由得再次想到了高質量c++程式設計的例題,這個題目在國內應該是相當有知名度,很多應聘的時候似乎都會看到它的身影,題目如下:
void getmemory(char *p)
void test(void)
請問執行 test 函式會有什麼樣的結果?
答:程式崩潰。 因為 getmemory 並不能傳遞動態記憶體, test 函式中的 str 一直都是 null。 strcpy(str, "hello world");將使程式崩 潰。
雖然有答案,但是我覺得作者還是沒有把內部的道理給說明白,導致很多人還是不得其義,這個題應該是四道題中最有代表型的,指標作為型參來傳值,這個值會不會返回呢?答案是不會,因為函式p只是乙個str的拷貝,也就是都指向相同位址的乙個變數而已,所有p是p,str是str,只是他們指向的位址相同,所以在這裡p也不過是個地地道道的值傳遞而已,不要被他的指標表象所迷惑。
char *getmemory(void) void test(void)
請問執行 test 函式會有什麼樣的結果? 答:可能是亂碼。 因為 getmemory 返回的是指向「棧記憶體」 的指標,該指標的位址不是 null,但其原 現的內容已經被清除,新內容不可知。
第二題就更進步了一步,不再傻傻的值傳遞了,知道用返回值了,答案也寫的比較清楚了,也就說這個位址是可以返回了,但是位址是在棧中的,所以呢不安全隨時可能被覆蓋就是這個意思。其實這道稍微修改一下就ok了,char
*p = (char *)malloc(12);
strcpy(p,
"hello world"),
return p;
void getmemory2(char **p, int num) void test(void) 請問執行 test 函式會有什麼樣的結果? 答: (1)能夠輸出 hello (2)記憶體洩漏
第三題就更有意思了,
既用了位址傳遞又用了堆中分配空間的辦法,可以說是對這道題的乙個答案的暗示吧,
這道題在最後加上
free(str);str=null;就完整了,但是顯得很囉嗦了。
void test(void)
}請問執行 test 函式會有什麼樣的結果? 答:篡改動態記憶體區的內容,後果難以預 料,非常危險。 因為 free(str);之後,str 成為野指標, if(str != null)語句不起作用。
這道顯然跟前面三題不是乙個意思了,這題也順便說一下吧,
free(str);這個到底做了什麼?如果你明白了這個,這道題也就沒什麼了,他到底幹什麼了呢,當然是釋放了指標指向的位址空間,也比方說房子都被人拆除了,你還去那也沒地方住了,所有str也就是答案所說的野指標了。
C 高質量程式設計點滴
摘自 http www.sudu.cn info html edu c 20070103 236588.html 一 你需要乙個函式將乙個陣列賦值為等差數列,並將會在函式的外部使用他。不合理 int getarray int n return p 合理 void getarray int p,int...
高質量C 程式設計點滴
一 你需要乙個函式將乙個陣列賦值為等差數列,並將會在函式的外部使用它。不合理 int getarray int n return p 合理 void getarray int p,int n 解析 檢查記憶體洩露的最好辦法,就是檢查完全配對的申請和釋放,在函式中申請而在外部釋放,將導致 的一致性變差...
高質量程式設計 筆記
1.高質量軟體開發之道 1.提高軟體質量的基本方法 2.軟體質量屬性 3.質量 生成率和成本 4.軟體過程改進 5.高質量軟體開發的基本方法 2.程式的基本概念 1.程式語言 一套規範的集合,主要包括語言使用字符集 資料型別集合 運算子集合 關鍵字集合 指令集合 語法規則 對特定構造的支援 函式 繼...