GetMemory函式的幾種經典考法

2021-07-22 02:23:34 字數 3624 閱讀 9489

試題4:

void getmemory( char *p )

void test( void )

試題5:

char *getmemory( void )

void test( void )

試題6:

void getmemory( char **p, int num )

void test( void )

試題7:

void test( void )

解答:試題4傳入中getmemory( char *p )函式的形參為字串指標,在函式內部修改形參並不能真正的改變傳入形參的值,執行完

char *str = null;

getmemory( str );

後的str仍然為null;

試題5中

char p = "hello world";

return p;

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

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

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

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

if ( *p == null )

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

char *str = (char *) malloc(100);

後未進行記憶體是否申請成功的判斷;

另外,在free(str)後未置str為空,導致可能變成乙個「野」指標,應加上:

str = null;

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

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

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

(1)指標的理解;

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

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

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

swap( int* p1,int* p2 )

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

swap( int* p1,int* p2 )

錯誤程式:

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 int main int argc,char argv str沒有得到分配記憶體的位址值。記憶體空間狀態 首先申請了四個位元組的棧空間,存放str指標,此時str的值為0,存放str的這塊記憶體的位址值為0x0012ff7c。呼叫函式 getmemory,...

GetMemory函式的幾種經典考法

試題4 void getmemory char p void test void 試題5 char getmemory void void test void 試題6 void getmemory char p,int num void test void 試題7 void test void 解答...

GetMemory函式詳解

include include include using namespace std char getmemory char p,int num int main void getmemory錯誤講解 指標練習 錯誤程式 void getmemory char p void test void 這...