今年秋季的校園招聘已經接近尾聲,筆試面試也參加了不少。發現有一道題經常出現,特拿來分享。
問題1:
void getmemory(char *p)
void test(void)
請問執行test函式會有什麼樣的結果?
問題2:
char*getmemory(void)
void test(void)
請問執行test函式會有什麼樣的結果?
答案很簡單,1 執行過程中會出現錯誤 2會輸出 亂碼
如果還有疑惑,gcc編譯及執行結果將消除你的疑慮。
第一段**在ubunu下的執行結果:
看吧!明顯的記憶體錯誤!
再看第2段**:
gcc的編譯警告大概已經很能說明問題了!
想必c語言高手會覺得這些問題很low level,可是不幸的是想我這樣c語言不紮實的人經常會犯這樣的錯誤!
c語言中,實參變數和形參變數之間的資料傳遞是單向的「值傳遞」方式,指標變數作函式引數也要遵循這一原則。呼叫函式不能改變實參指標變數的值(即指標的位址),但可以改變實參指標變數所指變數的值。
程式1就試圖改變 str的值,肯定不成功,getmemory執行完後,str還是null,所以在執行strcpy時,程式試圖給null的指標賦值,會發生執行時錯誤。程式
2的問題在於
getmemory
函式試圖返回區域性變數的位址。眾所周知,區域性變數的生命只存在於該函式體內,一旦離開該函式體,該區域性變數便在記憶體中消失,所以
str
得到的只能是亂碼。
因此,說到底,還是要牢記千萬不能返回區域性變數的位址,還有小心有指標情況的「傳值」!
一道關於字串逆序的筆試題
某同學在網上留的筆試題如下 函式實現將 進行如下操作 www.google.com轉成com.google.www 及mail.netease.com轉成com.netease.mail 不允許用stl,空間為0 1 思路如下 1.先對每個被 隔開的單詞都逆序一次。2.對整個串再逆序一次。對ptr從...
題目 CVTE的一道關於字串的筆試題
題目 答案 include include using namespace std char func char str1,char str2 for int i 0 i strlen str1 i for int i 0 i temp.size i str1 temp.size 0 return ...
一道簡單的求最大相似字串的筆試題
今天做了一道簡單的筆試題,不過由於當時面對乙個不是很友好的面試官有點小緊張,加之時間也比較緊,所以現場只寫了個類似下面的 寫在紙上的那個是不可執行的 題目是 求兩個字串中的最長相似字串,如字串 erdkhjghj 和 字串 gdfdghdkhjghkjljhhdr 中的最長相識字串是 dkhjgh ...