(指標練習)GetMemory錯誤講解

2021-06-10 02:41:05 字數 2299 閱讀 2657

錯誤程式:

void getmemory( char *p )

void test( void ) 

這個乙個考驗對指標理解的題目,上面程式在執行之後:

1,呼叫getmemory( str )後, str並未產生變化,依然是null.只是改變的str的乙個拷貝的記憶體的變化    

2,strcpy( str, "hello world" );程式執行到這將產生錯誤。

3,new的時候有可能記憶體出錯,應該在*p = (char *) malloc( num ); 後判斷記憶體是否申請成功,應加上:

if ( *p == null )

4,動態建立的記憶體沒釋放。

錯誤分析:

錯認為 getmemory(char   *p)中的 p 「就是」 getmemory(str)中的str。但p「不是」str,它只是「等於」str 。 

就象:   int   a   =   100;   

int   b   =   a;       //   現在b等於a   

b   =   500;         //   現在能認為a   =   500 ?      

顯然不能認為a   =   500,因為b只是等於a,但不是a!  當b改變的時候,a並不會改變,b就不等於a了。    因此,雖然p已經有new的記憶體,但str仍然是null   

getmemory(str);             //把str傳進去,str是乙個指標,而他實際上是乙個int      

void   getmemory(char   *p)     //   p是str的乙個副本   

雙重指標為什麼就可以了呢:   

getmemory(&str);             //把str的位址傳進去       

void   getmemory(char**p)     //   p是str位址的乙個副本   

修改方法1:(推薦使用這種方法)

void getmemory2(char **p)變為二級指標. 

void getmemory2(char**p, int num) 

void test(void)

修改方法2:

char *getmemory()

void test(void)

附錄a(相關資料)

試題5:

char *getmemory( void )

void test( void )

試題6:

void getmemory( char **p, int num )

void test( void )

試題7:

void test( void )

解答:試題5中

char p = "hello world"; 

return p;  

的p陣列為函式內的區域性自動變數,在函式返回後,記憶體已經被釋放。這是許多程式設計師常犯的錯誤,其根源在於不理解變數的生存期。

試題6中

1、getmemory避免了試題4的問題,傳入getmemory的引數為字串指標的指標,但是在getmemory中執行申請記憶體及賦值語句

*p = (char *) malloc( num ); 

後未判斷記憶體是否申請成功,應加上:

if ( *p == null )

2、試題6的test函式中也未對malloc的記憶體進行釋放。

試題7中

存在與試題6同樣的問題,在執行

char *str = (char *) malloc(100); 後未進行記憶體是否申請成功的判斷;另外,在free(str)後未置str為空,導致可能變成乙個「野」指標,應加上:  str = null; 

剖析:試題4~7考查面試者對記憶體操作的理解程度,基本功紮實的面試者一般都能正確的回答其中50~60的錯誤。但是要完全解答正確,卻也絕非易事。

對記憶體操作的考查主要集中在:

(1)指標的理解;

(2)變數的生存期及作用範圍;

(3)良好的動態記憶體申請和釋放習慣。

再看看下面的一段程式有什麼錯誤:

swap( int* p1,int* p2 )

在swap函式中,p是乙個「野」指標,有可能指向系統區,導致程式執行的崩潰。在vc++中debug執行時提示錯誤「access violation」。該程式應該改為:

swap( int* p1,int* p2 )

GetMemory錯誤講解(指標練習)

錯誤程式 void getmemory char p void test void 這個乙個考驗對指標理解的題目,上面程式在執行之後 1,呼叫getmemory str 後,str並未產生變化,依然是null.只是改變的str的乙個拷貝的記憶體的變化 2,strcpy str,hello world...

GetMemory錯誤講解(指標練習)

錯誤程式 void getmemory char p void test void 這個乙個考驗對指標理解的題目,上面程式在執行之後 1,呼叫getmemory str 後,str並未產生變化,依然是null.只是改變的str的乙個拷貝的記憶體的變化 2,strcpy str,hello world...

Linux C 指標練習

題目一 已知陣列內容如下 s 輸入乙個常數 m 1 m 9 使得該陣列內容順序後移n個位置。如n 3時,陣列後移3個位置後的內容為 如下 include int main int b 9 int p a int q b int i,m,n printf 請輸入要移動的位數 n scanf d m n...