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

下載本文檔

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

文檔簡介

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

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

3、xe0,那么比較就不相等?!是的,比較的時(shí)候全部轉(zhuǎn)換為 int,所以呢,a 還是作為一個(gè)負(fù)數(shù)存在,c 作為一個(gè)正數(shù)存在,于是就不相等了,所以 B 錯(cuò)。C 腫么就對了?a 是一個(gè) schar,賦值給 uint 的 b,前若干個(gè)字節(jié)不是補(bǔ) 0 嗎?首先 schar 轉(zhuǎn)換為 int,然后 int 轉(zhuǎn)換成 uint,所以最初是符號擴(kuò)展,然后一個(gè) int 賦值給了 uint,C correct!me 曾經(jīng)要寫一篇關(guān)于c的類型以及指針的 blog,不過最后沒有完成,不過還是可以參考一下的。下面哪些選項(xiàng)能編譯通過?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);分析:再次坑爹有木有!(其實(shí) me 比較確信這道題,是坑別人的爹,O_O)A 絕對是正確的,C 絕對是錯(cuò)的,D 基本肯定是錯(cuò)的,那 B 呢?要么 error ,要嚒 warning!如果是 warning 但是沒有 error ,這算神馬情況呢?B 確實(shí)不應(yīng)該選,至少語義上不該選!f() 返回一個(gè)臨時(shí)量,然后傳給 g 函數(shù),而 g 的參數(shù)是非 const 引用,是不能引用臨時(shí)量的!為嘛,如果 g 中修改了傳進(jìn)來的 string,那么會(huì)是怎么一回事呢?修改了一個(gè)臨時(shí)量的值?那這意義何在呢?但是如果將 g 的

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

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

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

8、 C 吧,應(yīng)該大家感覺都一樣。這里不涉及什么堆的事。假設(shè)在一個(gè) 32 位 little endian 的機(jī)器上運(yùn)行下面的程序,結(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. .分析:貌似問題沒有想的那么簡單。如果說運(yùn)行結(jié)果,很簡單,有人是 1 0 2;有人是 1 2 3。涉及到 little/big endian 和參數(shù)入棧的問題,me 表示現(xiàn)在有點(diǎn)無能為力,O_O下面哪些函數(shù)調(diào)用必須進(jìn)入內(nèi)核才能完成?A. fopen

9、B. exit C. memcpy D. strlen分析:有些無能為力。A 是要打開文件的,貌似設(shè)計(jì)很多內(nèi)核操作丫;exit 是退出進(jìn)程,結(jié)束進(jìn)程,應(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 的說法,哪些是錯(cuò)誤的?A. DMA,Direct Memory Acess 直接存儲(chǔ)器訪問,使得不同的速度的硬件設(shè)備可以直接通信,不通過

10、 CPU 干預(yù);B. DMA 訪問的時(shí)候需要從 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進(jìn)制為0xffffffe0 D 都不對/ 答案:C / 整形比較小于int的會(huì)擴(kuò)寬的int再比較, 而有符號數(shù)擴(kuò)寬填充符號位, 無符號數(shù)填充0, 導(dǎo)致擴(kuò)寬后兩個(gè)整形的二進(jìn)制不再相等, 選擇C. 編程測試:printf (”%x %x %x,a,b,c);結(jié)

11、果: ffffffe0 ffffffe0 e02)問下面的數(shù)據(jù)都存放在哪些存儲(chǔ)區(qū)?int main() char *p = hello,world; return 0;解析:根據(jù)C語言中的特性和定義p是一個(gè)局部變量,而C語言中局部變量存在于棧中,hello wrold是一個(gè)字符串字面常量,因此存儲(chǔ)于程序的只讀存儲(chǔ)區(qū)中,p在這里其實(shí)只是指向了hello wrold在只讀存儲(chǔ)區(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位機(jī)器上相當(dāng)于指針運(yùn)算 a + 4B. &a0+1 / 正確,數(shù)組首元素地址加1,根據(jù)指針運(yùn)算就是a1的地址C. (int*)&a+1 / 正確,數(shù)組地址被強(qiáng)制類型轉(zhuǎn)換為int*,然后加1,這樣和B表示的一個(gè)意思D. (int*)(char*)&a+sizeof(int)/ 正確,數(shù)據(jù)地址先被轉(zhuǎn)換為char*,然后加4,根據(jù)指針運(yùn)算公式,向前移動(dòng)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);會(huì)依次從a的地址開始輸出3個(gè)整型數(shù)據(jù)(4B)一共是12B,調(diào)用printf時(shí)參數(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個(gè)字節(jié)的結(jié)果就是:1 0 25)下面哪些說法正確?(B) A. 數(shù)組和鏈表都可以隨機(jī)訪問 B. 數(shù)組的插入和刪除可以 O(1) C. 哈希表沒有辦法做范圍檢查 D. 以上說法都不正確解析:數(shù)組可以直接通過下標(biāo)得到存儲(chǔ)的值 因此支持隨機(jī),訪問鏈表是鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)時(shí)無法支持隨機(jī)訪問,要訪問一個(gè)指定位置的元素必須從頭開始做指針移動(dòng)。哈希表支持直接通過關(guān)鍵碼得到值 其實(shí)數(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é), 大端存儲(chǔ) ,補(bǔ)齊16進(jìn)制表示為: 0x00 00 12 34 / unsigned char b=*(unsigned char *)&a; 由于大端存儲(chǔ), 所以上述int a變量的最低地址存儲(chǔ)的是 / 十六進(jìn)制表示中最左邊的1字節(jié), 為0x00. 8)如下關(guān)于編譯鏈接的說法錯(cuò)誤的是()A) 編譯優(yōu)化會(huì)使得編譯速度變慢B) 預(yù)編譯頭文件可以優(yōu)化程序的性能C) 靜態(tài)鏈接會(huì)使得可執(zhí)行文件偏大D) 動(dòng)態(tài)鏈接庫會(huì)使進(jìn)程啟動(dòng)速度偏慢9)如下關(guān)于鏈接的說法錯(cuò)誤的是()A)一個(gè)靜態(tài)庫中不能

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

17、序(含有多個(gè)源文件),在各個(gè)源文件中都有效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的代碼,下面那一個(gè)語句是不安全的: A.delete pA B.delete pB C.delete pC刪除那個(gè)都有錯(cuò)誤,編譯是無錯(cuò)誤,運(yùn)行是有錯(cuò)誤

19、1 linux下調(diào)試core的命令,察看堆棧狀態(tài)命令5 a34哪個(gè)不能表示 a11: *(&a00+5) *(*(a+1)+1) *(&a1+1) *(&a00+4)答案: *(&a1+1)a是數(shù)組的首地址,a1就表示a10地址了,不用再取地址了。6 fun(exp1,exp2),(exp3,exp4,exp5)有幾個(gè)實(shí)參?答案:兩個(gè)。形式參數(shù):在聲明和定義函數(shù)時(shí),寫在函數(shù)名后的括號中的參數(shù)。實(shí)參是調(diào)用參數(shù)中的變量,行參是被調(diào)用函數(shù)中的變量。10. *p=NULL *p=new char100 sizeof(p)各為多少?答案:都為4。因?yàn)槎际侵羔橆愋?,所占存?chǔ)空間必然為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分)下面這段代碼是把中英文混合字符串(漢字用兩個(gè)字節(jié)表示,特點(diǎn)是第一個(gè)字節(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è)運(yùn)行在 i386 系列計(jì)算機(jī)上):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程序代碼片段運(yùn)行后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)存的速度遠(yuǎn)遠(yuǎn)高于磁盤速度,所以為了解決這個(gè)矛盾,可以采用: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 一個(gè)打開過一次的 FILE *fp 指針會(huì)有什么結(jié)果,并請解釋??疾禳c(diǎn):導(dǎo)致文件描述符結(jié)構(gòu)中指針指向的內(nèi)存被重復(fù)釋放,進(jìn)而導(dǎo)致一些不可預(yù)期的異常。3)unsigned int a= 0x1234;unsigned char b=*(unsigned char *)&a;在32位大端模式處理器上變量b=/ 答案:0 / unsigned int a= 0x1234; 其中int是4字節(jié), 大端存儲(chǔ) ,補(bǔ)齊16

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

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

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

27、量在內(nèi)存中是否有區(qū)別?如果有,是什么區(qū)別?全局變量儲(chǔ)存在靜態(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)變量的作用域一定是局部的,例如在一個(gè)文件內(nèi)或一個(gè)函數(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ù)返回一個(gè)int型數(shù)據(jù)D) ptr是一個(gè)函數(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的作用是什么?這個(gè)簡單的問題很少有人能回答完全。在C語言中,關(guān)鍵字static有三個(gè)明顯的作用:1)在函數(shù)體,一個(gè)被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過程中維持其值不變。2) 在模塊內(nèi)(但在函數(shù)體外),一個(gè)被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。它是一個(gè)本地的全局變量。3) 在模塊內(nèi),一個(gè)被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。大多數(shù)應(yīng)試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個(gè)應(yīng)試者的嚴(yán)重的缺點(diǎn),因?yàn)樗@然不懂得本地化數(shù)據(jù)和代碼范圍

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

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

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

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

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

36、過程中函數(shù)調(diào)用時(shí)參數(shù)的傳遞也在棧上進(jìn)行什么是預(yù)編譯何時(shí)需要預(yù)編譯:、總是使用不經(jīng)常改動(dòng)的大型代碼體。 、程序由多個(gè)模塊組成,所有模塊都使用一組標(biāo)準(zhǔn)的包含文件和相同的編譯選項(xiàng)。在這種情況下,可以將所有包含文件預(yù)編譯為一個(gè)預(yù)編譯頭。char * const p;char const * pconst char *p上述三個(gè)有什么區(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. 以下代碼中的兩個(gè)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ù)組的大小,無法檢測動(dòng)態(tài)分配的或外部數(shù)組大小。函數(shù)外的str是一個(gè)靜態(tài)定義的數(shù)組,因此其大小為6,函數(shù)內(nèi)的str實(shí)際只是一個(gè)指向字符串的指針,沒有任何額外的與數(shù)組相關(guān)的信息,因此sizeof作用于上只將其當(dāng)指針看,一個(gè)指針為4個(gè)字節(jié),因此返回4。一個(gè)32位的機(jī)器,該機(jī)器的指針是多少位指針是多少位只要看地址總線的位數(shù)就行了。80386以后的機(jī)子都是32的數(shù)據(jù)總線。所以指針的位數(shù)就是4個(gè)字節(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)會(huì)認(rèn)為加一個(gè)a數(shù)組的偏移,是偏移了一個(gè)數(shù)組的大?。ū纠?個(gè)int)int *ptr=(int *)(&a+1); 則ptr實(shí)際是&(a5),也就是a+5原因如下:&a是數(shù)組指針,其類型為 int (*)5;而指針加1要根據(jù)指針類型加上一定的值,不同類型的指針+1之后增加的大小不同a是長度為5的int數(shù)組指針,所以要加 5*sizeof(int)所以ptr實(shí)際是a5但是prt與(&a+1)類型是不一樣的(這點(diǎn)很重要)所以prt-1只會(huì)減去sizeof(int*)a,&a的地址是一樣的,但意思不一樣,a是數(shù)組首地址,也就是a0的地址,&a是對象

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

42、s=AAA;然后又因?yàn)槭浅A?,所以對是s0的賦值操作是不合法的。1.有以下表達(dá)式:int a=248; b=4;int const c=21;const int *d=&a;int *const e=&b;int const *f const =&a;請問下列表達(dá)式哪些會(huì)被編譯器禁止?為什么?*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;*c 這是個(gè)什么東東,禁止*d 說了是const, 禁止e = &a 說了是const 禁止const *f const =&a; 禁止2.交換兩個(gè)變量的值,不使用第三個(gè)變量。即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ū)別在于默認(rèn)的存取權(quán)限不同,struct默認(rèn)為public,而class默認(rèn)為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 不能返回動(dòng)態(tài)內(nèi)存, free()對str操作很危險(xiǎn)5.char szstr10;strcpy(szstr,0123456789);產(chǎn)生什么結(jié)果?為什么?長度不一樣,會(huì)造成非法的OS8.類的靜態(tài)成員和非靜態(tài)成員有何區(qū)別?類的靜態(tài)成員每個(gè)類只有一個(gè),非靜態(tài)成員每個(gè)對象一個(gè)9.純虛函數(shù)如何定義?使用時(shí)應(yīng)注意什么?virtual void f()=0;是接

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

46、0000 ) ( );首先要將0x100000強(qiáng)制轉(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,是負(fù)數(shù),所以它的值就是0x00的補(bǔ)碼就是128,所以輸出128。這兩道題都是在考察二進(jìn)制向int或uint轉(zhuǎn)換時(shí)的最高位處理。分析下面的程序: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之后,有一個(gè)好的習(xí)慣就是將str=NULL.此時(shí)str指向空間的內(nèi)存已被回收,如果輸出語句之前還存在分配空間的操作的話,這段存儲(chǔ)空間是可能被重新分配給其他變量的,盡管這段程序確實(shí)是存在大大的問題(上面各位已經(jīng)說得很清楚了),但是通常會(huì)打印出world來。這是因?yàn)?,進(jìn)程中的內(nèi)存管理一般不是由操作系統(tǒng)完成的,而是由庫函數(shù)自己完成的。當(dāng)你malloc一塊內(nèi)存的時(shí)候,管理庫向操作系統(tǒng)申請一塊空間(可能會(huì)比你申請的大一些),然后在這塊空間中記錄一些管理信息(一般是在你申請的內(nèi)存前面一

49、點(diǎn)),并將可用內(nèi)存的地址返回。但是釋放內(nèi)存的時(shí)候,管理庫通常都不會(huì)將內(nèi)存還給操作系統(tǒng),因此你是可以繼續(xù)訪問這塊地址的,只不過。樓上都說過了,最好別這么干。char a10,strlen(a)為什么等于15?運(yùn)行的結(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是一個(gè)數(shù)組指針,即指向數(shù)組的指針*/char *str20;/*str是一個(gè)指針數(shù)組,其元素為指針型數(shù)據(jù)*/long a=0x801010;a+5=?0x801010用二進(jìn)制表示為:“1000 0000 0001 0000 0001 0000”,十進(jìn)制的值為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)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論