內(nèi)存題目自總_第1頁
內(nèi)存題目自總_第2頁
內(nèi)存題目自總_第3頁
內(nèi)存題目自總_第4頁
內(nèi)存題目自總_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、3 a34哪個不能表示 a11: *(&a00) *(*(a+1)+1) *(&a1+1) *(&a00+4) 4 for(int i.) for(int j.) printf(i,j); printf(j) 會出現(xiàn)什么問題 32 位機上根據(jù)下面的代碼,問哪些說法是正確的?signed char a = 0xe0;unsigned int b = a;unsigned char c = a;A. a0 & c0 為真 B. a = c 為真 C. b 的十六進制表示是:0xffffffe0 D. 上面都不對分析:坑爹丫,有木有!10 個人 9 個這個恐怕都不敢確定!(敢肯定的要么是高手,要么就

2、是錯的!) B me 認為是錯的,一個 uchar 和一個 schar 比較,真的就是一個字節(jié)在比較嗎?C me 認為是對的,將一個 schar 賦值給一個 uint,要不要符號擴展呢?是絕對會還是可能會呢?細節(jié)到底是神馬?O_OA 貌似比較確定,肯定是錯的,肯定?揭露真相:A 確實是錯的,B 也是錯的,C 是對的,所以 D 也是錯的。理由?A 錯是因為,a 是負數(shù),c 是正數(shù),即使跟 0 比較要轉(zhuǎn)換到 int(后面暫不區(qū)分轉(zhuǎn)換和類型提升,總之就是類型變了),也是一負一正,所以 A 錯。B 呢?是說一正一負不會相等,難道是因為這嗎?難道不是嗎?首先說 a 和 c 的二進制表示一模一樣,都是 0

3、xe0,那么比較就不相等?!是的,比較的時候全部轉(zhuǎn)換為 int,所以呢,a 還是作為一個負數(shù)存在,c 作為一個正數(shù)存在,于是就不相等了,所以 B 錯。C 腫么就對了?a 是一個 schar,賦值給 uint 的 b,前若干個字節(jié)不是補 0 嗎?首先 schar 轉(zhuǎn)換為 int,然后 int 轉(zhuǎn)換成 uint,所以最初是符號擴展,然后一個 int 賦值給了 uint,C correct!me 曾經(jīng)要寫一篇關(guān)于c的類型以及指針的 blog,不過最后沒有完成,不過還是可以參考一下的。下面哪些選項能編譯通過?int i;char a10;string f();string g(string &str)

4、;A. if(!i)f(); B. g(f(); C. a=a+1; D. g(abc);分析:再次坑爹有木有!(其實 me 比較確信這道題,是坑別人的爹,O_O)A 絕對是正確的,C 絕對是錯的,D 基本肯定是錯的,那 B 呢?要么 error ,要嚒 warning!如果是 warning 但是沒有 error ,這算神馬情況呢?B 確實不應(yīng)該選,至少語義上不該選!f() 返回一個臨時量,然后傳給 g 函數(shù),而 g 的參數(shù)是非 const 引用,是不能引用臨時量的!為嘛,如果 g 中修改了傳進來的 string,那么會是怎么一回事呢?修改了一個臨時量的值?那這意義何在呢?但是如果將 g 的

5、原型修改為 string g(const string&); 就是可以的,為么可以?訪問(只讀)臨時量就是正確的?那必須的,比如 u 可能想知道 a+b 的結(jié)果是多少,然后輸出!a+b 的結(jié)果就是一個臨時量。如果說修改 a+b 的結(jié)果,這是神馬個邏輯?!真相:C 錯是以為 a 是一個地址常量,不可能再被賦值。D 為嘛錯呢?abc 的類型可是 const char* 呢,是個常量指針呢!(可以用來初始化 string。)int a10; 問下面哪些不可以表示 a1 的地址?A. a+sizeof(int) B. &a0+1 C. (int*)&a+1 D. (int*)(char*)&a+siz

6、eof(int)分析:奇葩丫!(其實并不奇葩!)騰訊的題目有時候出的的確有水平丫,雖然出的太有水平了分就考不高了。me 想哭丫,想來想去還是在 A 和 B 中選錯了,%_%,當(dāng)時還特意提醒自己來著的,O_Oc+ 中的 sort 如何用來排序 a 數(shù)組呢?sort(a, a+N); 或是 sort(a, a+sizeof(a)/sizeof(a0); 當(dāng)時懵了,實際上 a+1,就是 a1 的地址呢!a 的類型是 int10,a+1 和一個 int* 類型的 +1 效果一樣,都表示偏移 1 個元素,所以 A 不能表示。(選錯誤的!) C 能表示是因為取了首地址作為一個 int* 然后 +1,就是偏

7、移一個元素,所以不選。B 腫么說呢,me 一直一位&a0 是一個普普通通的地址,+1 就是 +1個字節(jié),實際上是 +1 個元素!D 也能表示?將 a 的首地址轉(zhuǎn)換為一個 char* 指針,這個時候 +1 是偏移一個 char,也就是一個字節(jié),實際上應(yīng)該偏移 sizeof(int) 個字節(jié)才能到達 a1,所以 D 可以表示(不選)。不多說了。(如果是二維數(shù)組是不是會更懵呢,O_O)問下面的數(shù)據(jù)都存放在哪些存儲區(qū)?int main() char *p = hello,world; return 0;A. . B. . C. 棧和常量區(qū) D. 棧和堆分析:hello,world 是常量,趕腳應(yīng)該就是

8、 C 吧,應(yīng)該大家感覺都一樣。這里不涉及什么堆的事。假設(shè)在一個 32 位 little endian 的機器上運行下面的程序,結(jié)果是多少?#include int main() long long a = 1, b = 2, c = 3; printf(%d %d %dn, a, b, c); return 0;A. . B. . C. . D. .分析:貌似問題沒有想的那么簡單。如果說運行結(jié)果,很簡單,有人是 1 0 2;有人是 1 2 3。涉及到 little/big endian 和參數(shù)入棧的問題,me 表示現(xiàn)在有點無能為力,O_O下面哪些函數(shù)調(diào)用必須進入內(nèi)核才能完成?A. fopen

9、B. exit C. memcpy D. strlen分析:有些無能為力。A 是要打開文件的,貌似設(shè)計很多內(nèi)核操作丫;exit 是退出進程,結(jié)束進程,應(yīng)該也要深入內(nèi)核。memcpy ,me 一直猶豫用戶區(qū)的數(shù)據(jù)拷貝要不要通過內(nèi)核。strlen me 感覺關(guān)系不大。內(nèi)存管理中的 LRU 方法是用來管理神馬的?A. 虛擬內(nèi)存的分配 B. 虛擬內(nèi)存的釋放 C. 物理內(nèi)存的分配 D. 物理內(nèi)存的釋放分析:貌似是用來關(guān)系物理塊的,后面的填空題正好有說,O_O關(guān)于DMA 的說法,哪些是錯誤的?A. DMA,Direct Memory Acess 直接存儲器訪問,使得不同的速度的硬件設(shè)備可以直接通信,不通過

10、 CPU 干預(yù);B. DMA 訪問的時候需要從 CPU 那里奪得總線控制權(quán),然后.C. DMA 速度快;D. DMA 不需要中斷控制,CPU 管理不要它;1)signed char a=0xe0;unsigned int b=a;unsigned char c=a;下面說法正確的是:A (a0 )&(b0)為真 B c=a 為真 C b的16進制為0xffffffe0 D 都不對/ 答案:C / 整形比較小于int的會擴寬的int再比較, 而有符號數(shù)擴寬填充符號位, 無符號數(shù)填充0, 導(dǎo)致擴寬后兩個整形的二進制不再相等, 選擇C. 編程測試:printf (”%x %x %x,a,b,c);結(jié)

11、果: ffffffe0 ffffffe0 e02)問下面的數(shù)據(jù)都存放在哪些存儲區(qū)?int main() char *p = hello,world; return 0;解析:根據(jù)C語言中的特性和定義p是一個局部變量,而C語言中局部變量存在于棧中,hello wrold是一個字符串字面常量,因此存儲于程序的只讀存儲區(qū)中,p在這里其實只是指向了hello wrold在只讀存儲區(qū)中的地址而已。3)關(guān)于 int a10; 問下面哪些不可以表示 a1 的地址?(A) A. a+sizeof(int) B. &a0+1 C. (int*)&a+1 D. (int*)(char*)&a+sizeof(int

12、)A. a+sizeof(int)解析:A. a+sizeof(int) / 不正確, 在32位機器上相當(dāng)于指針運算 a + 4B. &a0+1 / 正確,數(shù)組首元素地址加1,根據(jù)指針運算就是a1的地址C. (int*)&a+1 / 正確,數(shù)組地址被強制類型轉(zhuǎn)換為int*,然后加1,這樣和B表示的一個意思D. (int*)(char*)&a+sizeof(int)/ 正確,數(shù)據(jù)地址先被轉(zhuǎn)換為char*,然后加4,根據(jù)指針運算公式,向前移動4 * sizeof(char),之后被轉(zhuǎn)換為int*,顯然是a1的地址 4)int main()long long a=1;long long b=2;lo

13、ng long c=3;printf(%d,%d,%d,a,b ,c);return 0;輸出結(jié)果是什么?(32位環(huán)境,cpu為小端模式,所有參數(shù)用棧傳遞)解答:在32和64上面, long long都是8字節(jié),printf(%d %d %dn, a, b, c);會依次從a的地址開始輸出3個整型數(shù)據(jù)(4B)一共是12B,調(diào)用printf時參數(shù)從右至左壓棧,壓棧順序是c,b,a且地址是連續(xù)存放的,小端情況下從a開始的棧去內(nèi)存內(nèi)容如下:0x 01 00 00 00 00 00 00 00 0x 02 00 00 00 00 00 00 00 0x 03 00 00 00 00 00 00 00所

14、以連續(xù)輸出12個字節(jié)的結(jié)果就是:1 0 25)下面哪些說法正確?(B) A. 數(shù)組和鏈表都可以隨機訪問 B. 數(shù)組的插入和刪除可以 O(1) C. 哈希表沒有辦法做范圍檢查 D. 以上說法都不正確解析:數(shù)組可以直接通過下標(biāo)得到存儲的值 因此支持隨機,訪問鏈表是鏈?zhǔn)酱鎯Y(jié)構(gòu)時無法支持隨機訪問,要訪問一個指定位置的元素必須從頭開始做指針移動。哈希表支持直接通過關(guān)鍵碼得到值 其實數(shù)組就是一種哈希表 下標(biāo)就是關(guān)鍵碼 通過下標(biāo)直接得到值 因此哈希表肯定需要做范圍檢查也有辦法做范圍檢查的unsigned int a= 0x1234;unsigned char b=*(unsigned char *)&a;

15、在32位大端模式處理器上變量b=/ 答案:0 / unsigned int a= 0x1234; 其中int是4字節(jié), 大端存儲 ,補齊16進制表示為: 0x00 00 12 34 / unsigned char b=*(unsigned char *)&a; 由于大端存儲, 所以上述int a變量的最低地址存儲的是 / 十六進制表示中最左邊的1字節(jié), 為0x00. 8)如下關(guān)于編譯鏈接的說法錯誤的是()A) 編譯優(yōu)化會使得編譯速度變慢B) 預(yù)編譯頭文件可以優(yōu)化程序的性能C) 靜態(tài)鏈接會使得可執(zhí)行文件偏大D) 動態(tài)鏈接庫會使進程啟動速度偏慢9)如下關(guān)于鏈接的說法錯誤的是()A)一個靜態(tài)庫中不能

16、包含兩個同名全局函數(shù)的定義B)一個動態(tài)庫中不能包含兩個同名全局函數(shù)的定義C)如果兩個靜態(tài)庫都包含一個同名全局函數(shù),他們不能同時被鏈接D)如果兩個動態(tài)庫都包含一個同名全局函數(shù),他們不能同時被鏈接4.在一個cpp文件里面,定義了一個static類型的全局變量,下面一個正確的描述是:A.只能在該cpp所在的編譯模塊中使用該變量B.該變量的值是不可改變的C.該變量不能在類的成員函數(shù)中引用D.這種變量只能是基本類型(如int,char)不能是C+類型Static全局變量和普通全局變量:針對:一個工程里有多個cpp文件時相同點:存儲方式相同,都是靜態(tài)存儲;不同點:作用域不同。普通全局變量-作用域是整個源程

17、序(含有多個源文件),在各個源文件中都有效Static全局變量-作用域是當(dāng)前源文件5.觀察下面一段代碼:class ClassApublic:virtual ClassA();virtual void FunctionA();class ClassBpublic: virtual void FunctionB();class ClassC : public ClassA,public ClassBpublic:; ClassC aObject;ClassA* pA=&aObject;ClassB* pB=&aObject;ClassC* pC=&aObject;關(guān)于pA,pB,pC的取值,下面

18、的描述中正確的是:A.pA,pB,pC的取值相同. B.pC=pA+pBC.pA和pB不相同 D.pC不等于pA也不等于pB6.參照1.5的代碼,假設(shè)定義了ClassA* pA2,下面正確的代碼是:A.pA2=static_cast(pB);B.void* pVoid=static_cast(pB); pA2=static_cast(pVoid);C.pA2=pB;D.pA2=static_cast(static_cast(pB);7.參照1.5的代碼,下面那一個語句是不安全的: A.delete pA B.delete pB C.delete pC刪除那個都有錯誤,編譯是無錯誤,運行是有錯誤

19、1 linux下調(diào)試core的命令,察看堆棧狀態(tài)命令5 a34哪個不能表示 a11: *(&a00+5) *(*(a+1)+1) *(&a1+1) *(&a00+4)答案: *(&a1+1)a是數(shù)組的首地址,a1就表示a10地址了,不用再取地址了。6 fun(exp1,exp2),(exp3,exp4,exp5)有幾個實參?答案:兩個。形式參數(shù):在聲明和定義函數(shù)時,寫在函數(shù)名后的括號中的參數(shù)。實參是調(diào)用參數(shù)中的變量,行參是被調(diào)用函數(shù)中的變量。10. *p=NULL *p=new char100 sizeof(p)各為多少?答案:都為4。因為都是指針類型,所占存儲空間必然為4。/百度/5.下面結(jié)

20、構(gòu)體 struct s1 char ch, *ptr; union short a, b; unsigned int c:2, d:1; struct s1 *next; ; 的大小是_: A. 12字節(jié) B.16字節(jié) C.20字節(jié) D. 24字節(jié)9.使用malloc系統(tǒng)調(diào)用分配的內(nèi)存是在_ 上分配的? A 棧; B bss; C 物理內(nèi)存; D 堆 1.(5分)下面這段代碼是把中英文混合字符串(漢字用兩個字節(jié)表示,特點是第一個字節(jié)的最高位為1)中的大寫字母轉(zhuǎn)化為小寫字母,請找出其中的bug,注意各種異常情況。 for (char *piterator = szWord; *piterator

21、 != 0; piterator+) if (*piterator & 0x80 != 0) piterator+; else if (*piterator = A & *piterator = Z) piterator += 32; 3. 代碼void func()static int val;中,變量 val 的內(nèi)存地址位于:A. 已初始化數(shù)據(jù)段 B.未初始化數(shù)據(jù)段 C.堆 D.棧6. short a100,sizeof(a) 返回?A. 2 B. 4 C. 100 D. 200 E. 4008. 以下代碼打印的結(jié)果是(假設(shè)運行在 i386 系列計算機上):struct st_tint s

22、tatus;short *pdata;char errstr32;st_t st16;char *p = (char *)( st2.errstr + 32 );printf( %d, ( p - (char *)(st) ) );A. 32 B. 114 C. 120 D. 1112不定向選擇3.以下的C程序代碼片段運行后C和d的值分別是多少()Int a =1,b =2;Int c,d;C =(a&b)&a;d =(a&b)&a;A.0,0B.0,1C.1,0D.1,17. 內(nèi)存的速度遠遠高于磁盤速度,所以為了解決這個矛盾,可以采用:A 并行技術(shù) B 虛存技術(shù) C 緩沖技術(shù) D 通道技術(shù)3

23、. 代碼void func()static int val;中,變量 val 的內(nèi)存地址位于:A. 已初始化數(shù)據(jù)段 B.未初始化數(shù)據(jù)段 C.堆 D.棧1. (5 分)重復(fù)多次 fclose 一個打開過一次的 FILE *fp 指針會有什么結(jié)果,并請解釋??疾禳c:導(dǎo)致文件描述符結(jié)構(gòu)中指針指向的內(nèi)存被重復(fù)釋放,進而導(dǎo)致一些不可預(yù)期的異常。3)unsigned int a= 0x1234;unsigned char b=*(unsigned char *)&a;在32位大端模式處理器上變量b=/ 答案:0 / unsigned int a= 0x1234; 其中int是4字節(jié), 大端存儲 ,補齊16

24、進制表示為: 0x00 00 12 34 / unsigned char b=*(unsigned char *)&a; 由于大端存儲, 所以上述int a變量的最低地址存儲的是 / 十六進制表示中最左邊的1字節(jié), 為0x00. /華為/華為/華為/2.某32位系統(tǒng)下, C+程序,請計算sizeof 的值(5分).char str = “”char *p = str ;int n = 10;請計算sizeof (str ) = ?(1)sizeof ( p ) = ?(2)sizeof ( n ) = ?(3)void Foo ( char str100)請計算sizeof( str ) =

25、?(4)void *p = malloc( 100 );請計算sizeof ( p ) = ?(5)答:(1)17 (2)4 (3) 4 (4)4 (5)413.C+中什么數(shù)據(jù)分配在棧或堆中,New分配數(shù)據(jù)是在近堆還是遠堆中?答:棧: 存放局部變量,函數(shù)調(diào)用參數(shù),函數(shù)返回值,函數(shù)返回地址。由系統(tǒng)管理堆: 程序運行時動態(tài)申請,new 和malloc申請的內(nèi)存就在堆上近堆還是遠堆不是很清楚。19 關(guān)于內(nèi)存對齊的問題以及sizof()的輸出答:編譯器自動對齊的原因:為了提高程序的性能,數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對齊。原因在于,為了訪問未對齊的內(nèi)存,處理器需要作兩次內(nèi)存訪問;然而,對

26、齊的內(nèi)存訪問僅需要一次訪問。1.static有什么用途?(請至少說明兩種) 1)在函數(shù)體,一個被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過程中維持其值不變。 2) 在模塊內(nèi)(但在函數(shù)體外),一個被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。它是一個本地的全局變量。 3) 在模塊內(nèi),一個被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用2.引用與指針有什么區(qū)別? 1) 引用必須被初始化,指針不必。 2) 引用初始化以后不能被改變,指針可以改變所指的對象。 3) 不存在指向空值的引用,但是存在指向空值的指針。4.全局變量和局部變

27、量在內(nèi)存中是否有區(qū)別?如果有,是什么區(qū)別?全局變量儲存在靜態(tài)數(shù)據(jù)庫,局部變量在堆棧。6.堆棧溢出一般是由什么原因?qū)е碌??沒有回收垃圾資源。7.什么函數(shù)不能聲明為虛函數(shù)?constructor函數(shù)不能聲明為虛函數(shù)。15、如下定義,則s在內(nèi)存中占多大空間?unionstructunsignedcharaa:4;unsignedcharab:4;a;unsignedcharc;unsignedchard;s;A) 1 byte B) 2byte C) 3byte D) 4byteA16、如下定義: uniontagAAAAstructcharucFirst;shortusSecond;charucT

28、hird;half_a;longlI;number;在按1字節(jié)對齊情況下,sizeof(union tagAAAA)的大小是: A 在按4字節(jié)對齊情況下,sizeof(union tagAAAA)的大小是: D A) 4byte B) 6byte C) 8byte D) 12byte17、0x12345678在采用BigEndian中內(nèi)存的排列順序是 A ,在采用LittleEndian內(nèi)存中的排列順序是 C 。(答案從左到右內(nèi)存地址依次增加)A) 12 34 56 78 B) 34 12 78 56 C) 78 56 34 12 D) 56 78 12 3418、關(guān)于靜態(tài)變量,下面說法“不正

29、確”的有: A A) 靜態(tài)變量在堆棧中分配B) 靜態(tài)變量的作用域一定是局部的,例如在一個文件內(nèi)或一個函數(shù)內(nèi)C) 靜態(tài)變量可分為靜態(tài)局變量和靜態(tài)全局部變量D) 靜態(tài)變量存在于數(shù)據(jù)段中20、設(shè)有如下定義:int (*ptr)();則以下敘述中正確的是: C A) ptr 是指向一維數(shù)組的指針變量B) ptr是指向int型數(shù)據(jù)的指針變量C) ptr 是指向函數(shù)的指針,該函數(shù)返回一個int型數(shù)據(jù)D) ptr是一個函數(shù)名,該函數(shù)的返回值是指向int型數(shù)據(jù)的指針21、在Windows95環(huán)境下,定義數(shù)組:int *a24;則數(shù)組a所占用的內(nèi)存單元為: D A)8字節(jié) B) 32字節(jié) C) 64字節(jié) D)不

30、確定. 關(guān)鍵字static的作用是什么?這個簡單的問題很少有人能回答完全。在C語言中,關(guān)鍵字static有三個明顯的作用:1)在函數(shù)體,一個被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過程中維持其值不變。2) 在模塊內(nèi)(但在函數(shù)體外),一個被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。它是一個本地的全局變量。3) 在模塊內(nèi),一個被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。大多數(shù)應(yīng)試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個應(yīng)試者的嚴(yán)重的缺點,因為他顯然不懂得本地化數(shù)據(jù)和代碼范圍

31、的好處和重要性。Const 7關(guān)鍵字const有什么含意?我只要一聽到被面試者說:const意味著常數(shù),我就知道我正在和一個業(yè)余者打交道。去年Dan Saks已經(jīng)在他的文章里完全概括了const的所有用法,因此ESP(譯者:Embedded Systems Programming)的每一位讀者應(yīng)該非常熟悉const能做什么和不能做什么.如果你從沒有讀到那篇文章,只要能說出const意味著只讀就可以了。盡管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)如果應(yīng)試者能正確回答這個問題,我將問他一個附加的問題:下面的聲明都是什么意思?c

32、onst int a;int const a;const int *a;int * const a;int const * a const;/*/前兩個的作用是一樣,a是一個常整型數(shù)。第三個意味著a是一個指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個意思a是一個指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后一個意味著a是一個指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的,同時指針也是不可修改的)。如果應(yīng)試者能正確回答這些問題,那么他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關(guān)鍵字 const,也還是能

33、很容易寫出功能正確的程序,那么我為什么還要如此看重關(guān)鍵字const呢?我也如下的幾下理由:1) 關(guān)鍵字const的作用是為給讀你代碼的人傳達非常有用的信息,實際上,聲明一個參數(shù)為常量是為了告訴了用戶這個參數(shù)的應(yīng)用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學(xué)會感謝這點多余的信息。(當(dāng)然,懂得用const的程序員很少會留下的垃圾讓別人來清理的。)2) 通過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼。3) 合理地使用關(guān)鍵字const可以使編譯器很自然地保護那些不希望被改變的參數(shù),防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現(xiàn)。1、局部變量能否和全局變

34、量重名? 答:能,局部會屏蔽全局。要用全局變量,需要使用:局部變量可以與全局變量同名,在函數(shù)內(nèi)引用這個變量時,會用到同名的局部變量,而不會用到全局變量。對于有些編譯器而言,在同一個函數(shù)內(nèi)可以定義多個同名的局部變量,比如在兩個循環(huán)體內(nèi)都定義一個同名的局部變量,而那個局部變量的作用域就在那個循環(huán)體內(nèi)。2、如何引用一個已經(jīng)定義過的全局變量? 答:extern 可以用引用頭文件的方式,也可以用extern關(guān)鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變理,假定你將那個變寫錯了,那么在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那么在編譯期間不會報錯,而在連接期間報

35、錯。3、全局變量可不可以定義在可被多個.C文件包含的頭文件中?為什么? 答:可以,在不同的C文件中以static形式來聲明同名全局變量。 可以在不同的C文件中聲明同名的全局變量,前提是其中只能有一個C文件中對此變量賦初值,此時連接不會出錯。4、隊列和棧有什么區(qū)別? 隊列先進先出,棧后進先出2Heap與stack的差別。Heap是堆,stack是棧。Stack的空間由操作系統(tǒng)自動分配/釋放,Heap上的空間手動分配/釋放。Stack空間有限,Heap是很大的自由存儲區(qū)C中的malloc函數(shù)分配的內(nèi)存空間即在堆上,C+中對應(yīng)的是new操作符。程序在編譯期對變量和函數(shù)分配內(nèi)存都在棧上進行,且程序運行

36、過程中函數(shù)調(diào)用時參數(shù)的傳遞也在棧上進行什么是預(yù)編譯何時需要預(yù)編譯:、總是使用不經(jīng)常改動的大型代碼體。 、程序由多個模塊組成,所有模塊都使用一組標(biāo)準(zhǔn)的包含文件和相同的編譯選項。在這種情況下,可以將所有包含文件預(yù)編譯為一個預(yù)編譯頭。char * const p;char const * pconst char *p上述三個有什么區(qū)別?char * const p; /常量指針,p的值不可以修改char const * p;/指向常量的指針,指向的常量值不可以改const char *p; /和char const *pchar str1 = abc;char str2 = abc;const ch

37、ar str3 = abc;const char str4 = abc;const char *str5 = abc;const char *str6 = abc;char *str7 = abc;char *str8 = abc;cout ( str1 = str2 ) endl;cout ( str3 = str4 ) endl;cout ( str5 = str6 ) endl;cout ( str7 = str8 ) endl;結(jié)果是:0 0 1 1解答:str1,str2,str3,str4是數(shù)組變量,它們有各自的內(nèi)存空間;而str5,str6,str7,str8是指針,它們指向相同

38、的常量區(qū)域。12. 以下代碼中的兩個sizeof用法有問題嗎?C易void UpperCase( char str ) / 將 str 中的小寫字母轉(zhuǎn)換成大寫字母 for( size_t i=0; isizeof(str)/sizeof(str0); +i ) if( a=stri & stri=z ) stri -= (a-A );char str = aBcDe;cout str字符長度為: sizeof(str)/sizeof(str0) endl;UpperCase( str );cout str endl;答:函數(shù)內(nèi)的sizeof有問題。根據(jù)語法,sizeof如用于數(shù)組,只能測出靜態(tài)

39、數(shù)組的大小,無法檢測動態(tài)分配的或外部數(shù)組大小。函數(shù)外的str是一個靜態(tài)定義的數(shù)組,因此其大小為6,函數(shù)內(nèi)的str實際只是一個指向字符串的指針,沒有任何額外的與數(shù)組相關(guān)的信息,因此sizeof作用于上只將其當(dāng)指針看,一個指針為4個字節(jié),因此返回4。一個32位的機器,該機器的指針是多少位指針是多少位只要看地址總線的位數(shù)就行了。80386以后的機子都是32的數(shù)據(jù)總線。所以指針的位數(shù)就是4個字節(jié)了。main()int a5=1,2,3,4,5; int *ptr=(int *)(&a+1); printf(%d,%d,*(a+1),*(ptr-1);輸出:2,5*(a+1)就是a1,*(ptr-1)就

40、是a4,執(zhí)行結(jié)果是2,5&a+1不是首地址+1,系統(tǒng)會認為加一個a數(shù)組的偏移,是偏移了一個數(shù)組的大?。ū纠?個int)int *ptr=(int *)(&a+1); 則ptr實際是&(a5),也就是a+5原因如下:&a是數(shù)組指針,其類型為 int (*)5;而指針加1要根據(jù)指針類型加上一定的值,不同類型的指針+1之后增加的大小不同a是長度為5的int數(shù)組指針,所以要加 5*sizeof(int)所以ptr實際是a5但是prt與(&a+1)類型是不一樣的(這點很重要)所以prt-1只會減去sizeof(int*)a,&a的地址是一樣的,但意思不一樣,a是數(shù)組首地址,也就是a0的地址,&a是對象

41、(數(shù)組)首地址,a+1是數(shù)組下一元素的地址,即a1,&a+1是下一個對象的地址,即a5.1.請問以下代碼有什么問題:int main()char a;char *str=&a;strcpy(str,hello);printf(str);return 0;沒有為str分配內(nèi)存空間,將會發(fā)生異常問題出在將一個字符串復(fù)制進一個字符變量指針?biāo)傅刂?。雖然可以正確輸出結(jié)果,但因為越界進行內(nèi)在讀寫而導(dǎo)致程序崩潰。char* s=AAA;printf(%s,s);s0=B;printf(%s,s);有什么錯?AAA是字符串常量。s是指針,指向這個字符串常量,所以聲明s的時候就有問題。cosnt char*

42、s=AAA;然后又因為是常量,所以對是s0的賦值操作是不合法的。1.有以下表達式:int a=248; b=4;int const c=21;const int *d=&a;int *const e=&b;int const *f const =&a;請問下列表達式哪些會被編譯器禁止?為什么?*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;*c 這是個什么東東,禁止*d 說了是const, 禁止e = &a 說了是const 禁止const *f const =&a; 禁止2.交換兩個變量的值,不使用第三個變量。即a=3,b=5,交換之后a=5,b=3;有兩種解法, 一

43、種用算術(shù)算法, 一種用(異或)a = a + b;b = a - b;a = a - b; ora = ab;/ 只能對int,char.b = ab;a = ab;ora = b = a;3.c和c+中的struct有什么不同?c和c+中struct的主要區(qū)別是c中的struct不可以含有成員函數(shù),而c+中的struct可以。c+中struct和class的主要區(qū)別在于默認的存取權(quán)限不同,struct默認為public,而class默認為private4.i nclude i nclude void getmemory(char *p) p=(char *) malloc(100); str

44、cpy(p,hello world);int main( ) char *str=NULL; getmemory(str); printf(%s/n,str); free(str); return 0; 程序崩潰,getmemory中的malloc 不能返回動態(tài)內(nèi)存, free()對str操作很危險5.char szstr10;strcpy(szstr,0123456789);產(chǎn)生什么結(jié)果?為什么?長度不一樣,會造成非法的OS8.類的靜態(tài)成員和非靜態(tài)成員有何區(qū)別?類的靜態(tài)成員每個類只有一個,非靜態(tài)成員每個對象一個9.純虛函數(shù)如何定義?使用時應(yīng)注意什么?virtual void f()=0;是接

45、口,子類必須要實現(xiàn)1:(void *)ptr 和 (*(void*)ptr的結(jié)果是否相同?其中ptr為同一個指針.(void *)ptr 和 (*(void*)ptr值是相同的2:int main() int x=3; printf(%d,x); return 1; 問函數(shù)既然不會被其它函數(shù)調(diào)用,為什么要返回1?mian中,c標(biāo)準(zhǔn)認為0表示成功,非0表示錯誤。具體的值是某中具體出錯信息1,要對絕對地址0x100000賦值,我們可以用(unsigned int*)0x100000 = 1234;那么要是想讓程序跳轉(zhuǎn)到絕對地址是0x100000去執(zhí)行,應(yīng)該怎么做?*(void (*)( )0x10

46、0000 ) ( );首先要將0x100000強制轉(zhuǎn)換成函數(shù)指針,即:(void (*)()0x100000然后再調(diào)用它:*(void (*)()0x100000)();用typedef可以看得更直觀些:typedef void(*)() voidFuncPtr;*(voidFuncPtr)0x100000)();unsigned short A = 10;printf(A = %un, A);char c=128; printf(c=%dn,c);輸出多少?并分析過程第一題,A 0xfffffff5,int值 為11,但輸出的是uint。所以輸出4294967285第二題,c0x10,輸出的

47、是int,最高位為1,是負數(shù),所以它的值就是0x00的補碼就是128,所以輸出128。這兩道題都是在考察二進制向int或uint轉(zhuǎn)換時的最高位處理。分析下面的程序:void GetMemory(char *p,int num) *p=(char *)malloc(num); int main() char *str=NULL; GetMemory(&str,100); strcpy(str,hello); free(str); if(str!=NULL) strcpy(str,world); printf(n str is %s,str); getchar(); 問輸出結(jié)果是什么?希望大家能說

48、說原因,先謝謝了輸出str is world。free 只是釋放的str指向的內(nèi)存空間,它本身的值還是存在的.所以free之后,有一個好的習(xí)慣就是將str=NULL.此時str指向空間的內(nèi)存已被回收,如果輸出語句之前還存在分配空間的操作的話,這段存儲空間是可能被重新分配給其他變量的,盡管這段程序確實是存在大大的問題(上面各位已經(jīng)說得很清楚了),但是通常會打印出world來。這是因為,進程中的內(nèi)存管理一般不是由操作系統(tǒng)完成的,而是由庫函數(shù)自己完成的。當(dāng)你malloc一塊內(nèi)存的時候,管理庫向操作系統(tǒng)申請一塊空間(可能會比你申請的大一些),然后在這塊空間中記錄一些管理信息(一般是在你申請的內(nèi)存前面一

49、點),并將可用內(nèi)存的地址返回。但是釋放內(nèi)存的時候,管理庫通常都不會將內(nèi)存還給操作系統(tǒng),因此你是可以繼續(xù)訪問這塊地址的,只不過。樓上都說過了,最好別這么干。char a10,strlen(a)為什么等于15?運行的結(jié)果i nclude stdio.hi nclude string.hvoid main()char aa10;printf(%d,strlen(aa);sizeof()和初不初始化,沒有關(guān)系;strlen()和初始化有關(guān)。char (*str)20;/*str是一個數(shù)組指針,即指向數(shù)組的指針*/char *str20;/*str是一個指針數(shù)組,其元素為指針型數(shù)據(jù)*/long a=0x801010;a+5=?0x801010用二進制表示為:“1000 0000 0001 0000 0001 0000”,十進制的值為8392720,再加上5就是8392725羅1)給定結(jié)構(gòu)struct A char t:4; char k:4; unsigned short i:8; unsigned long m;問sizeof(A) = ?給定結(jié)構(gòu)struct A char t:4; 4位 char k:4; 4位 unsigned short i:8; 8位 unsigned lo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論