試題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」
。該程式應該改為:
野指標和記憶體操作分析
初始也指標 野指標通常是因為指標變數中儲存餓值不是乙個合法的記憶體位址而造成的 2.棧空間上的區域性變數所占用的空間 野指標不是null指標,是指不可用記憶體的指標 null指標不容易出錯,因為if語句很好判斷乙個指標是不是null c語言沒有任何手段可以判斷乙個指標收費為野指標!野指標的由來 1....
野指標與非法記憶體操作
野指標 野指標通常是因為指標變數中儲存的值不是乙個合法的記憶體位址而造成的。1.在堆空間動態申請的 2.區域性變數所在的棧。野指標不是null指標,是指向不可用記憶體的指標,也可能是乙個動態的記憶體位址,但是這個記憶體別人正在使用,這也是不合法的位址。null指標不容易用錯,因為if語句很好判斷乙個...
野指標與非法記憶體操作
野指標通常是因為指標變數中儲存的值不是乙個合法的記憶體位址而造成的。1.在堆空間動態申請的 2.區域性變數所在的棧。野指標不是null指標,是指向不可用記憶體的指標,也可能是乙個動態的記憶體位址,但是這個記憶體別人正在使用,這也是不合法的位址。null指標不容易用錯,因為if語句很好判斷乙個指標是不...