C 面試題 之指標與引用(2)

2022-02-22 12:58:43 字數 2617 閱讀 3228

#includeusing namespace std;

void getmemory(char *p,int num)

int main ()

解析:毛病出在函式getmemory中,編譯器總是要為函式的每個引數製作臨時副本,在本例中,void getmemory(char *p , int num)中的*p實際上是主函式中str的乙個副本,而在函式getmemory中只是把p所指向的記憶體位址改變了,但是str絲毫未變,因為函式getmemory沒有返回值,因此str並不指向p所申請的那段記憶體,所以函式getmemory並不能輸出任何東西,如下圖所示。事實上,每次執行一次getmemory就會申請一塊記憶體,但是申請的記憶體卻不能有效釋放,結果是記憶體一直被獨佔,最終造成記憶體洩露。

這樣的話程式就可以執行成功了,我們分別列印 *str 、 str 、 &str 可以發現,結果分別是 h 、 hello 、 0024fa80 。str就是字串的值;*str 是字串首字元,&str 就是字串的位址值。

當然也可以用函式返回值來傳遞動態記憶體。這種方法更簡單,**如下:

#includeusing namespace std;

char *getmemory(char *p,int num)

int main ()

我們可以對這道題推而廣之,看一下整型變數是如何傳值的,**如下:

#includeusing namespace std;

void getmemory1(int *num)

int main ()

getmemory1把 a 的位址傳了進來,*num 是位址裡的值,是 a 的副本.通過直接修改位址裡的值,不需要有返回值,也把 a 給修改了,因為 a 所指向的位址的值發生了改變.

答案:

程式崩潰.因為getmemory 並不能傳遞動態記憶體,主函式中的 str 一直是null。

#includeusing namespace std;

int main ()

~a(){};

void fun()

private:

int m_a;

int m_b;

};class b

~b();

void fun()

private:

int m_c;

};void main ()

解析:首先可以肯定的是上面的**是非常槽糕的,無論是可讀性還是安全性都很差。寫這種**的人,按照jarne stroustrup(c++標誌化制定者)的說法,應該「斬立決」。

但是不得不說這也是一道很好考察你對記憶體偏移的理解的題:

b *p = (b *)(&a);

這是乙個野蠻的轉化,強制把 a 位址內容看成是乙個b類物件,p 指向的是 a 類的記憶體空間。

b類只有乙個元素m_c 但是 a類的記憶體空間存放第乙個元素的位置是 m_a, p指向的是物件的記憶體首位址,比如:0x22ff58,但p->fun()呼叫b::fun()來列印m_c時,編譯器對m_c的認識就是m_c距離物件的偏移量是 0,於是列印了物件a首位址的偏移量 0x22ff58+0變數值,即就是m_a的值1.

答案:

執行結果是:1

#includeusing namespace std;

class a

void print () };

class b : public a

};int main ()

解析:b類中的 m_a 把 a 類中的 m_a 覆蓋掉了。在構造 b 類時,先呼叫 a 類的建構函式,所以 a 類中的 m_a 是1,b.print()列印的是 a 類中的    m_a ,而b類中的 m_a 是2。

答案:

答案:

(1)malloc與free是c++/c語言的標準庫函式,new/delete是c++的運算子。它們都可用於申請動態記憶體和釋放記憶體。

(2)對於非內部資料型別的物件而言,只用malloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。

(3)因此c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new ,以及乙個能完成清理與釋放記憶體工作的運算子delete。new/delete 不是庫函式而是運算子。

面試題 指標 引用

返回目錄 問題 問 引用與指標有什麼區別?答 1.引用必須初始化,指標可以不用。2.引用初始化以後就不能被改變 即只能初始化一次,始終只指向指定的物件 而指標可以改變所指向的物件。3.不存在指向空值的引用,而指標可以指向乙個空值,即空指標。4.因為引用不能指向空值,這意味著使用引用之前不需要測試其合...

c 面試題之陣列與指標

關於陣列與指標的問題,常見的有,指向陣列的指標,宣告陣列指標和指標陣列等,在這裡主要看看指向陣列的指標是怎麼回事。指向陣列的指標,總的來說,實際上可以歸納為如下幾點 1 有乙個一維陣列int a1 10 定義乙個指標,指向一維陣列名。2 有乙個一維陣列int a2 10 定義乙個指標,指向一維陣列名...

面試題 引用和指標

1 引用 簡單理解引用就是乙個變數的另乙個名字,從這個名字的角度對變數可以加以修飾,同時擁有const指標的特性 所以在宣告時必須初始化 1 inta 1 2const intb 4 3int ref a 必須初始化 declared as reference but not initialized...