GetMemory錯誤講解(指標練習)

2021-04-30 18:39:52 字數 2225 閱讀 9942

錯誤程式:

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位址的乙個副本  

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

void getmemory2(char**p, int num)

void test(void)

修改方法2:

char *getmemory()

void test(void)

試題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...

golang指標講解

基礎型別指標 var ps string var pi int var pf float64 var pb bool 結構體指標 type person struct var pperson person在把指標使用的得心應手之前,首先要熟悉go語言中這兩個操作符 與 先說說 變數名,表示對變數取位...