分析下面**有什麼問題?
(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結構的系統,您是用幾層結構來開發,每一層之間的關係...