天天看點

【No.9 記憶體洩漏了麼】

==【注意】== 程式語言隻是我們與計算機交流并讓計算機實作我們創造性思想的工具,可以并鼓勵深入掌握一門語言,但千萬别沉迷于鑽某種語言的牛角尖,一定要把握好二者間的度

本帖屬不定時連載貼,以試卷的形式提出一個比較基礎的問題供大家思考讨論,問題的解析将在下一更新貼中一并給出,這樣做是希望還不清楚問題的朋友有自己思考和讨論的時間,希望大家能從這些文章中有所收獲。

貼中問題屬我在學習C\C++過程中遇到的一些文法或者比較隐晦的程式問題,其中有自己的總結,也不乏網絡上搜尋到的經典解析,在此分享給大家,希望能起到抛磚引玉的作用

【No.9 記憶體洩漏了麼?】

由于連載形式,每帖第二部分都配有上一問題的解答。為了保持文章的針對性和一緻性,

[問題9]

請找出下面C代碼的錯誤并想辦法改正:

複制内容到剪貼闆

<code>#include&lt;stdio.h&gt; #include&lt;malloc.h&gt; #include&lt;string.h&gt; void AllocateMem(char *ptr, int size) {   ptr = (char *)malloc(sizeof(char *) * size); } void main(void) {   char *p = NULL;   AllocateMem(p,5);   strcpy(p,"1234");   printf("%s\n",p); }</code>

問題淺析

<code>#include&lt;iostream&gt; int main(int argc, char **argv) {   const char *str1 = "abc";  //無錯誤,聲明str1為指向常量                                          //的字元類型指針,并将其初始                                          //化指向字元串"abc"                                          //即str1是一個指向const char的普通指針                                          //可以修改str1的指向,但是不能試圖                                          //通過對str1解引用去修改它所指向的内容      char * const str2 = "abc";  //無錯誤,聲明str2為指向普通                                           //字元的常量指針,并将其初始                                           //化指向字元串"abc"                                           //即str2是一個指向普通char的常量指針                                           //可以通過對str2解引用修改其指向的内                                           //容,但是不能修改str2的指向   //根據以上兩條定義,下面對以下指派語句進行淺析   str1[1] = 'B';  //錯誤:str1指向的是常量,是以其指向的内容不能被修改   *str1[1] = 'B';  //文法錯誤,[ ]優先級高于*,是以先得到str1[1]這                         //字元'b',然後試圖對常量字元'b'進行解引用,出錯   *str1 = "ABC";  //錯誤:str1指向的是常量,是以不能試圖通過對str1解引用                           //修改其指向的值   str1 = "ABC";  //正确:str1是一個指向常量的普通指針,是以可以修改str1                         //的指向,本句執行後,str1指向新的字元串"ABC"   str2[1] = 'B';  //正确:str2是一個指向普通char類型的常量指針,可以通過                       //對str2解引用修改其指向的值,這句執行後str2指向的字元串                       //為"aBc"   *str2[1] = 'B';  //文法錯誤,[ ]優先級高于*,是以先得到str1[1]這                         //字元'b',然後試圖對常量字元'b'進行解引用,出錯   *str2 = "ABC";  //錯誤:雖然可以通過對str2解引用修改其指向的值                           //但是 *str2 得到的是一個字元變量,不能将字元串"ABC"                           //指派給一個字元變量   str2 = "ABC";  //錯誤:str2是一個常量指針,不能修改它的指向   return EXIT_SUCCESS; }</code>

     本文轉自Bill_Hoo 51CTO部落格,原文連結:http://blog.51cto.com/billhoo/733273,如需轉載請自行聯系原作者

繼續閱讀