一道經常出現的字串記憶體位址問題的筆試題

2021-06-19 12:36:40 字數 1086 閱讀 5841

今年秋季的校園招聘已經接近尾聲,筆試面試也參加了不少。發現有一道題經常出現,特拿來分享。

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