每天幾道筆(面)試題

2021-08-04 15:09:47 字數 2551 閱讀 7432

分析下面**有什麼問題?

(1)

void test1()

解答:st1r長度為11個位元組,需要11個位元組的大小才能放下,而string只有10個位元組的大小。

(2)

void test2()

strcpy( string, str1 );

}

解答:str1是陣列名不能進行複製,最起碼要是*str1 = 『a』;其次,對字元陣列賦值後,使用庫函式strcpy進行拷貝操作,strcpy會從源位址一直往後拷貝,直到遇到』\0』為止。所以拷貝的長度是不定的。如果一直沒有遇到』\0』導致越界訪問非法記憶體,程式就崩了。

(3)

void test3(char* str1) 

char

string[10];

if( strlen( str1 ) <= 10 )

}

解答:strlen計算的長度是不計算『\0』的大小的,而sizeof是計算的, if( strlen( str1 ) <= 10 ) 沒計算『\0』的大小,拷貝到string中會越界。

(4)

寫出完整版的strcpy函式.

char *strcpy(char *arr1,char *arr2)

int i = 0;

while( arr1 != '\0')

*arr2 = '\0';

return arr2;

}

(5)

分別給出bool,int,float,指標變數 與「零值」比較的 if 語句(假設變數名為var)

解答:bool型變數:if(!var)

int型變數: if(var==0)

float型變數:

const float epsinon = 0.00001;

if ((x >= - epsinon) && (x <= epsinon)

指標變數:  if(var==null)

(6)

標頭檔案中的編譯巨集

#ifndef __incvxworksh

#define __incvxworksh

#endif

extern "c"

#endif

#endif /* __incvxworksh */

標頭檔案中的編譯巨集 的作用是防止被重複引用。

作為一種物件導向的語言,c++支援函式過載,而過程式語言c則不支援。函式被c++編譯後在symbol庫中的名字與c語言的不同。例如,假設某個函式的原型為:

void foo(int x, int y);

該函式被c編譯器編譯後在symbol庫中的名字為_foo,而c++編譯器則會產生像_foo_int_int之類的名字。_foo_int_int這樣的名字包含了函式名和函式引數數量及型別資訊,c++就是考這種機制來實現函式過載的。

為了實現c和c++的混合程式設計,c++提供了c連線交換指定符號extern 「c」來解決名字匹配問題,函式宣告前加上extern 「c」後,則編譯器就會按照c語言的方式將該函式編譯為_foo,這樣c語言中就可以呼叫c++的函式了。

(7)請說出static和const關鍵字盡可能多的作用

【解答】

static關鍵字至少有下列n個作用:

(1)函式體內static變數的作用範圍為該函式體,不同於auto變數,該變數的記憶體只被分配一次,因此其值在下次呼叫時仍維持上次的值;

(2)在模組內的static全域性變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問;

(3)在模組內的static函式只可被這一模組內的其它函式呼叫,這個函式的使用範圍被限制在宣告它的模組內;

(4)在類中的static成員變數屬於整個類所擁有,對類的所有物件只有乙份拷貝;

(5)在類中的static成員函式屬於整個類所擁有,這個函式不接收this指標,因而只能訪問類的static成員變數。

const關鍵字至少有下列n個作用:

(1)欲阻止乙個變數被改變,可以使用const關鍵字。在定義該const變數時,通常需要對它進行初始化,因為以後就沒有機會再去改變它了;

(2)對指標來說,可以指定指標本身為const,也可以指定指標所指的資料為const,或二者同時指定為const;

(3)在乙個函式宣告中,const可以修飾形參,表明它是乙個輸入引數,在函式內部不能改變其值;

(4)對於類的成員函式,若指定其為const型別,則表明其是乙個常函式,不能修改類的 成員變數;

(5)對於類的成員函式,有時候必須指定其返回值為const型別,以使得其返回值不為「左值」。例如:

const classa operator*(const classa& a1,const classa& a2);

operator*的返回結果必須是乙個const物件。如果不是,這樣的****也不會編譯出錯:

classa a, b, c;

(a * b) = c; // 對a*b的結果賦值

操作(a * b) = c顯然不符合程式設計者的初衷,也沒有任何意義

幾道面試題

系統呼叫與函式的區別 從程式完成的功能來看,函式庫提供的函式通常是不需要作業系統的服務,函式是在使用者空間內執行的,除非函式涉及到i o操作等,一般是不會切到核心態的。系統呼叫是要求作業系統為使用者提供程序,提供某種服務,通常是涉及系統的硬體資源和一些敏感的軟體資源等。函式庫的函式,尤其與輸入輸出相...

幾道面試題

1 下列程式片段執行時間排序 1 for uint i 0 i 1024 i char url char malloc 4096 memset url,0x0,4096 free url 2 for uint i 0 i 1024 i 3 char url char malloc 4096 for ...

幾道面試題

q 您在什麼情況下會用到虛方法?它與介面有什麼不同?q override與過載有什麼區別?q 值型別與引用型別有什麼區別?q 怎樣理解靜態變數?q 向伺服器傳送請求有幾種方式?q datareader與dataset有什麼區別?q 用.net做b s結構的系統,您是用幾層結構來開發,每一層之間的關係...