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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

2、人 9 個這個恐怕都不敢確定!(敢肯定的要么是高手,要么就是錯的!) B me 認為是錯的,一個 uchar 和一個 schar 比較,真的就是一個字節在比較嗎?C me 認為是對的,將一個 schar 賦值給一個 uint,要不要符號擴展呢?是絕對會還是可能會呢?細節到底是神馬?O_O"A 貌似比較確定,肯定是錯的,肯定?揭露真相:A 確實是錯的,B 也是錯的,C 是對的,所以 D 也是錯的。理由?A 錯是因為,a 是負數,c 是正數,即使跟 0 比較要轉換到 int(后面暫不區分轉換和類型提升,總之就是類型變了),也是一負一正,所以 A 錯。B 呢?是說一正一負不會相等,難道是因

3、為這嗎?難道不是嗎?首先說 a 和 c 的二進制表示一模一樣,都是 0xe0,那么比較就不相等?!是的,比較的時候全部轉換為 int,所以呢,a 還是作為一個負數存在,c 作為一個正數存在,于是就不相等了,所以 B 錯。C 腫么就對了?a 是一個 schar,賦值給 uint 的 b,前若干個字節不是補 0 嗎?首先 schar 轉換為 int,然后 int 轉換成 uint,所以最初是符號擴展,然后一個 int 賦值給了 uint,C correct!me 曾經要寫一篇關于c的類型以及指針的 blog,不過最后沒有完成,不過還是可以參考一下的。下面哪些選項能編譯通過?int i;char a

4、10;string f();string g(string &str);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 確實不應該選,至少語義上不該選!f() 返回一個臨時量,然后傳給 g 函數,而 g 的參數是非 const 引用,是不能引用臨時量的!為嘛,如果

5、g 中修改了傳進來的 string,那么會是怎么一回事呢?修改了一個臨時量的值?那這意義何在呢?但是如果將 g 的原型修改為 string g(const string&); 就是可以的,為么可以?訪問(只讀)臨時量就是正確的?那必須的,比如 u 可能想知道 a+b 的結果是多少,然后輸出!a+b 的結果就是一個臨時量。如果說修改 a+b 的結果,這是神馬個邏輯?!真相:C 錯是以為 a 是一個地址常量,不可能再被賦值。D 為嘛錯呢?"abc" 的類型可是 const char* 呢,是個常量指針呢!(可以用來初始化 string。)int a10; 問下面哪些不可

6、以表示 a1 的地址?A. a+sizeof(int) B. &a0+1 C. (int*)&a+1 D. (int*)(char*)&a+sizeof(int)分析:奇葩丫!(其實并不奇葩!)騰訊的題目有時候出的的確有水平丫,雖然出的太有水平了分就考不高了。me 想哭丫,想來想去還是在 A 和 B 中選錯了,%>_<%,當時還特意提醒自己來著的,O_O"c+ 中的 sort 如何用來排序 a 數組呢?sort(a, a+N); 或是 sort(a, a+sizeof(a)/sizeof(a0); 當時懵了,實際上 a+1,就是 a1 的地址呢!a

7、 的類型是 int10,a+1 和一個 int* 類型的 +1 效果一樣,都表示偏移 1 個元素,所以 A 不能表示。(選錯誤的!) C 能表示是因為取了首地址作為一個 int* 然后 +1,就是偏移一個元素,所以不選。B 腫么說呢,me 一直一位&a0 是一個普普通通的地址,+1 就是 +1個字節,實際上是 +1 個元素!D 也能表示?將 a 的首地址轉換為一個 char* 指針,這個時候 +1 是偏移一個 char,也就是一個字節,實際上應該偏移 sizeof(int) 個字節才能到達 a1,所以 D 可以表示(不選)。不多說了。(如果是二維數組是不是會更懵呢,O_O")

8、問下面的數據都存放在哪些存儲區?int main() char *p = "hello,world" return 0;A. . B. . C. 棧和常量區 D. 棧和堆分析:"hello,world" 是常量,趕腳應該就是 C 吧,應該大家感覺都一樣。這里不涉及什么堆的事。假設在一個 32 位 little endian 的機器上運行下面的程序,結果是多少?#include <stdio.h>int main() long long a = 1, b = 2, c = 3; printf("%d %d %dn", a,

9、b, c); return 0;A. . B. . C. . D. .分析:貌似問題沒有想的那么簡單。如果說運行結果,很簡單,有人是 1 0 2;有人是 1 2 3。涉及到 little/big endian 和參數入棧的問題,me 表示現在有點無能為力,O_O"下面哪些函數調用必須進入內核才能完成?A. fopen B. exit C. memcpy D. strlen分析:有些無能為力。A 是要打開文件的,貌似設計很多內核操作丫;exit 是退出進程,結束進程,應該也要深入內核。memcpy ,me 一直猶豫用戶區的數據拷貝要不要通過內核。strlen me 感覺關系不大。內存管

10、理中的 LRU 方法是用來管理神馬的?A. 虛擬內存的分配 B. 虛擬內存的釋放 C. 物理內存的分配 D. 物理內存的釋放分析:貌似是用來關系物理塊的,后面的填空題正好有說,O_O"關于DMA 的說法,哪些是錯誤的?A. DMA,Direct Memory Acess 直接存儲器訪問,使得不同的速度的硬件設備可以直接通信,不通過 CPU 干預;B. DMA 訪問的時候需要從 CPU 那里奪得總線控制權,然后.C. DMA 速度快;D. DMA 不需要中斷控制,CPU 管理不要它;1)signed char a=0xe0;unsigned int b=a;unsigned char

11、c=a;下面說法正確的是:A (a>0 )&&(b>0)為真 B c=a 為真 C b的16進制為0xffffffe0 D 都不對/ 答案:C / 整形比較小于int的會擴寬的int再比較, 而有符號數擴寬填充符號位, 無符號數填充0, 導致擴寬后兩個整形的二進制不再相等, 選擇C. 編程測試:printf (”%x %x %x",a,b,c);結果: ffffffe0 ffffffe0 e02)問下面的數據都存放在哪些存儲區?int main() char *p = "hello,world" return 0;解析:根據C語言中的特

12、性和定義p是一個局部變量,而C語言中局部變量存在于棧中,"hello wrold"是一個字符串字面常量,因此存儲于程序的只讀存儲區中,p在這里其實只是指向了"hello wrold"在只讀存儲區中的地址而已。3)關于 int a10; 問下面哪些不可以表示 a1 的地址?(A) A. a+sizeof(int) B. &a0+1 C. (int*)&a+1 D. (int*)(char*)&a+sizeof(int)A. a+sizeof(int)解析:A. a+sizeof(int) / 不正確, 在32位機器上相當于指針運算

13、a + 4B. &a0+1 / 正確,數組首元素地址加1,根據指針運算就是a1的地址C. (int*)&a+1 / 正確,數組地址被強制類型轉換為int*,然后加1,這樣和B表示的一個意思D. (int*)(char*)&a+sizeof(int)/ 正確,數據地址先被轉換為char*,然后加4,根據指針運算公式,向前移動4 * sizeof(char),之后被轉換為int*,顯然是a1的地址 4)int main()long long a=1;long long b=2;long long c=3;printf("%d,%d,%d",a,b ,c)

14、;return 0;輸出結果是什么?(32位環境,cpu為小端模式,所有參數用棧傳遞)解答:在32和64上面, long long都是8字節,printf("%d %d %dn", a, b, c);會依次從a的地址開始輸出3個整型數據(4B)一共是12B,調用printf時參數從右至左壓棧,壓棧順序是c,b,a且地址是連續存放的,小端情況下從a開始的棧去內存內容如下: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所以連續輸出12個字節的結果就是:1 0 25)

15、下面哪些說法正確?(B) A. 數組和鏈表都可以隨機訪問 B. 數組的插入和刪除可以 O(1) C. 哈希表沒有辦法做范圍檢查 D. 以上說法都不正確解析:數組可以直接通過下標得到存儲的值 因此支持隨機,訪問鏈表是鏈式存儲結構時無法支持隨機訪問,要訪問一個指定位置的元素必須從頭開始做指針移動。哈希表支持直接通過關鍵碼得到值 其實數組就是一種哈希表 下標就是關鍵碼 通過下標直接得到值 因此哈希表肯定需要做范圍檢查也有辦法做范圍檢查的unsigned int a= 0x1234;unsigned char b=*(unsigned char *)&a;在32位大端模式處理器上變量b=/ 答

16、案:0 / unsigned int a= 0x1234; 其中int是4字節, 大端存儲 ,補齊16進制表示為: 0x00 00 12 34 / unsigned char b=*(unsigned char *)&a; 由于大端存儲, 所以上述int a變量的最低地址存儲的是 / 十六進制表示中最左邊的1字節, 為0x00. 8)如下關于編譯鏈接的說法錯誤的是()A) 編譯優化會使得編譯速度變慢B) 預編譯頭文件可以優化程序的性能C) 靜態鏈接會使得可執行文件偏大D) 動態鏈接庫會使進程啟動速度偏慢9)如下關于鏈接的說法錯誤的是()A)一個靜態庫中不能包含兩個同名全局函數的定義B)

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

18、文件中都有效Static全局變量-作用域是當前源文件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;關于pA,pB,pC的取值,下面的描述

19、中正確的是:A.pA,pB,pC的取值相同. B.pC=pA+pBC.pA和pB不相同 D.pC不等于pA也不等于pB6.參照1.5的代碼,假設定義了ClassA* pA2,下面正確的代碼是:A.pA2=static_cast<ClassA*>(pB);B.void* pVoid=static_cast<void*>(pB); pA2=static_cast<ClassA*>(pVoid);C.pA2=pB;D.pA2=static_cast<ClassA*>(static_cast<ClassC*>(pB);7.參照1.5的代碼,下

20、面那一個語句是不安全的: A.delete pA B.delete pB C.delete pC刪除那個都有錯誤,編譯是無錯誤,運行是有錯誤1 linux下調試core的命令,察看堆棧狀態命令5 a34哪個不能表示 a11: *(&a00+5) *(*(a+1)+1) *(&a1+1) *(&a00+4)答案: *(&a1+1)a是數組的首地址,a1就表示a10地址了,不用再取地址了。6 fun(exp1,exp2),(exp3,exp4,exp5)有幾個實參?答案:兩個。形式參數:在聲明和定義函數時,寫在函數名后的括號中的參數。實參是調用參數中的變量,行參是被

21、調用函數中的變量。10. *p=NULL *p=new char100 sizeof(p)各為多少?答案:都為4。因為都是指針類型,所占存儲空間必然為4。/百度/5.下面結構體 struct s1 char ch, *ptr; union short a, b; unsigned int c:2, d:1; struct s1 *next; ; 的大小是_: A. 12字節 B.16字節 C.20字節 D. 24字節9.使用malloc系統調用分配的內存是在_ 上分配的? A 棧; B bss; C 物理內存; D 堆 1.(5分)下面這段代碼是把中英文混合字符串(漢字用兩個字節表示,特點是第

22、一個字節的最高位為1)中的大寫字母轉化為小寫字母,請找出其中的bug,注意各種異常情況。 for (char *piterator = szWord; *piterator != 0; piterator+) if (*piterator & 0x80 != 0) piterator+; else if (*piterator >= 'A' && *piterator <= 'Z') piterator += 32; 3. 代碼void func()static int val;中,變量 val 的內存地址位于:A. 已初始化

23、數據段 B.未初始化數據段 C.堆 D.棧6. short a100,sizeof(a) 返回?A. 2 B. 4 C. 100 D. 200 E. 4008. 以下代碼打印的結果是(假設運行在 i386 系列計算機上):struct st_tint status;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程序代碼片段運

24、行后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. 內存的速度遠遠高于磁盤速度,所以為了解決這個矛盾,可以采用:A 并行技術 B 虛存技術 C 緩沖技術 D 通道技術3. 代碼void func()static int val;中,變量 val 的內存地址位于:A. 已初始化數據段 B.未初始化數據段 C.堆 D.棧1. (5 分)重復多次 fclose 一個打開過一次的 FILE *fp 指針會有什么結果,并請解釋??疾禳c:導致文件

25、描述符結構中指針指向的內存被重復釋放,進而導致一些不可預期的異常。3)unsigned int a= 0x1234;unsigned char b=*(unsigned char *)&a;在32位大端模式處理器上變量b=/ 答案:0 / unsigned int a= 0x1234; 其中int是4字節, 大端存儲 ,補齊16進制表示為: 0x00 00 12 34 / unsigned char b=*(unsigned char *)&a; 由于大端存儲, 所以上述int a變量的最低地址存儲的是 / 十六進制表示中最左邊的1字節, 為0x00. /華為/華為/華為/2.

26、某32位系統下, 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 ) = ?(4)void *p = malloc( 100 );請計算sizeof ( p ) = ?(5)答:(1)17 (2)4 (3) 4 (4)4 (5)413.C+中什么數據分配在?;蚨阎?,New分配數據是在近堆還是遠堆中?答:棧: 存放局部變量,函數

27、調用參數,函數返回值,函數返回地址。由系統管理堆: 程序運行時動態申請,new 和malloc申請的內存就在堆上近堆還是遠堆不是很清楚。19 關于內存對齊的問題以及sizof()的輸出答:編譯器自動對齊的原因:為了提高程序的性能,數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在于,為了訪問未對齊的內存,處理器需要作兩次內存訪問;然而,對齊的內存訪問僅需要一次訪問。1.static有什么用途?(請至少說明兩種)    1)在函數體,一個被聲明為靜態的變量在這一函數被調用過程中維持其值不變。    2) 在模塊內(但在函數體外),

28、一個被聲明為靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。    3) 在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地范圍內使用2.引用與指針有什么區別?    1) 引用必須被初始化,指針不必。    2) 引用初始化以后不能被改變,指針可以改變所指的對象。    3) 不存在指向空值的引用,但是存在指向空值的指針。4.全局變量和局部變量在內存中是否有區別?如果有,是什么區

29、別?全局變量儲存在靜態數據庫,局部變量在堆棧。6.堆棧溢出一般是由什么原因導致的?沒有回收垃圾資源。7.什么函數不能聲明為虛函數?constructor函數不能聲明為虛函數。15、如下定義,則s在內存中占多大空間?union    struct            unsigned char aa:4;        unsigned&

30、#160;char ab:4;     a;    unsigned char c;    unsigned char d; s;A) 1 byte B) 2byte C) 3byte D) 4byteA16、如下定義: union tagAAAA    struct       

31、0;     char ucFirst;        short usSecond;        char ucThird;    half_a;    long lI;number;在按1字節對齊情況下,sizeof(union tagAAAA)的大小是: A 在

32、按4字節對齊情況下,sizeof(union tagAAAA)的大小是: D A) 4byte B) 6byte C) 8byte D) 12byte17、0x12345678在采用BigEndian中內存的排列順序是 A ,在采用LittleEndian內存中的排列順序是 C 。(答案從左到右內存地址依次增加)A) 12 34 56 78 B) 34 12 78 56 C) 78 56 34 12 D) 56 78 12 3418、關于靜態變量,下面說法“不正確”的有: A A) 靜態變量在堆棧中分配B) 靜態變量的作用域一定是局部的,例如在一個文件內或一個函數內C) 靜態變量可分為靜態局變

33、量和靜態全局部變量D) 靜態變量存在于數據段中20、設有如下定義:int (*ptr)();則以下敘述中正確的是: C A) ptr 是指向一維數組的指針變量B) ptr是指向int型數據的指針變量C) ptr 是指向函數的指針,該函數返回一個int型數據D) ptr是一個函數名,該函數的返回值是指向int型數據的指針21、在Windows95環境下,定義數組:int *a24;則數組a所占用的內存單元為: D A)8字節 B) 32字節 C) 64字節 D)不確定. 關鍵字static的作用是什么?這個簡單的問題很少有人能回答完全。在C語言中,關鍵字static有三個明顯的作用:1)在函數體

34、,一個被聲明為靜態的變量在這一函數被調用過程中維持其值不變。2) 在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。3) 在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地范圍內使用。大多數應試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個應試者的嚴重的缺點,因為他顯然不懂得本地化數據和代碼范圍的好處和重要性。Const 7關鍵字const有什么含意?我只要一聽到被面試者說:"const意味著常數",我就知

35、道我正在和一個業余者打交道。去年Dan Saks已經在他的文章里完全概括了const的所有用法,因此ESP(譯者:Embedded Systems Programming)的每一位讀者應該非常熟悉const能做什么和不能做什么.如果你從沒有讀到那篇文章,只要能說出const意味著"只讀"就可以了。盡管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)如果應試者能正確回答這個問題,我將問他一個附加的問題:下面的聲明都是什么意思?const int a;int const a;const int *a;int * c

36、onst a;int const * a const;/*/前兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)。第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。最后一個意味著a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。如果應試者能正確回答這些問題,那么他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關鍵字 const,也還是能很容易寫出功能正確的程序,那么我為什么還要如此看重關鍵字const呢?我也如下的幾下理

37、由:1) 關鍵字const的作用是為給讀你代碼的人傳達非常有用的信息,實際上,聲明一個參數為常量是為了告訴了用戶這個參數的應用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學會感謝這點多余的信息。(當然,懂得用const的程序員很少會留下的垃圾讓別人來清理的。)2) 通過給優化器一些附加的信息,使用關鍵字const也許能產生更緊湊的代碼。3) 合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。1、局部變量能否和全局變量重名? 答:能,局部會屏蔽全局。要用全局變量,需要使用":"局部

38、變量可以與全局變量同名,在函數內引用這個變量時,會用到同名的局部變量,而不會用到全局變量。對于有些編譯器而言,在同一個函數內可以定義多個同名的局部變量,比如在兩個循環體內都定義一個同名的局部變量,而那個局部變量的作用域就在那個循環體內。2、如何引用一個已經定義過的全局變量? 答:extern 可以用引用頭文件的方式,也可以用extern關鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變理,假定你將那個變寫錯了,那么在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那么在編譯期間不會報錯,而在連接期間報錯。3、全局變量可不可以定義在可被多個.C文件包含的頭文件中?

39、為什么? 答:可以,在不同的C文件中以static形式來聲明同名全局變量。 可以在不同的C文件中聲明同名的全局變量,前提是其中只能有一個C文件中對此變量賦初值,此時連接不會出錯。4、隊列和棧有什么區別? 隊列先進先出,棧后進先出2Heap與stack的差別。Heap是堆,stack是棧。Stack的空間由操作系統自動分配/釋放,Heap上的空間手動分配/釋放。Stack空間有限,Heap是很大的自由存儲區C中的malloc函數分配的內存空間即在堆上,C+中對應的是new操作符。程序在編譯期對變量和函數分配內存都在棧上進行,且程序運行過程中函數調用時參數的傳遞也在棧上進行什么是預編譯何時需要預編

40、譯:、總是使用不經常改動的大型代碼體。 、程序由多個模塊組成,所有模塊都使用一組標準的包含文件和相同的編譯選項。在這種情況下,可以將所有包含文件預編譯為一個預編譯頭。char * const p;char const * pconst char *p上述三個有什么區別?char * const p; /常量指針,p的值不可以修改char const * p;/指向常量的指針,指向的常量值不可以改const char *p; /和char const *pchar str1 = "abc"char str2 = "abc"const char str3 =

41、 "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 ) <<

42、endl;cout << ( str7 = str8 ) << endl;結果是:0 0 1 1解答:str1,str2,str3,str4是數組變量,它們有各自的內存空間;而str5,str6,str7,str8是指針,它們指向相同的常量區域。12. 以下代碼中的兩個sizeof用法有問題嗎?C易void UpperCase( char str ) / 將 str 中的小寫字母轉換成大寫字母 for( size_t i=0; i<sizeof(str)/sizeof(str0); +i ) if( 'a'<=stri &&

43、stri<='z' ) stri -= ('a'-'A' );char str = "aBcDe"cout << "str字符長度為: " << sizeof(str)/sizeof(str0) << endl;UpperCase( str );cout << str << endl;答:函數內的sizeof有問題。根據語法,sizeof如用于數組,只能測出靜態數組的大小,無法檢測動態分配的或外部數組大小。函數外的str是一個靜態定義的數組,

44、因此其大小為6,函數內的str實際只是一個指向字符串的指針,沒有任何額外的與數組相關的信息,因此sizeof作用于上只將其當指針看,一個指針為4個字節,因此返回4。一個32位的機器,該機器的指針是多少位指針是多少位只要看地址總線的位數就行了。80386以后的機子都是32的數據總線。所以指針的位數就是4個字節了。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)就是a4,執行結果是2,5&a+1不是首地址

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

46、是對象(數組)首地址,a+1是數組下一元素的地址,即a1,&a+1是下一個對象的地址,即a5.1.請問以下代碼有什么問題:int main()char a;char *str=&a;strcpy(str,"hello");printf(str);return 0;沒有為str分配內存空間,將會發生異常問題出在將一個字符串復制進一個字符變量指針所指地址。雖然可以正確輸出結果,但因為越界進行內在讀寫而導致程序崩潰。char* s="AAA"printf("%s",s);s0='B'printf("

47、%s",s);有什么錯?"AAA"是字符串常量。s是指針,指向這個字符串常量,所以聲明s的時候就有問題。cosnt char* 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 這是個什

48、么東東,禁止*d 說了是const, 禁止e = &a 說了是const 禁止const *f const =&a; 禁止2.交換兩個變量的值,不使用第三個變量。即a=3,b=5,交換之后a=5,b=3;有兩種解法, 一種用算術算法, 一種用(異或)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的主要區別是c中的struct不可以含有成員函數,而c+中的struct可以。c+中struct和class的主

49、要區別在于默認的存取權限不同,struct默認為public,而class默認為private4.i nclude <stdio.h>i nclude <stdlib.h>void getmemory(char *p) p=(char *) malloc(100); strcpy(p,"hello world");int main( ) char *str=NULL; getmemory(str); printf("%s/n",str); free(str); return 0; 程序崩潰,getmemory中的malloc 不能

50、返回動態內存, free()對str操作很危險5.char szstr10;strcpy(szstr,"0123456789");產生什么結果?為什么?長度不一樣,會造成非法的OS8.類的靜態成員和非靜態成員有何區別?類的靜態成員每個類只有一個,非靜態成員每個對象一個9.純虛函數如何定義?使用時應注意什么?virtual void f()=0;是接口,子類必須要實現1:(void *)ptr 和 (*(void*)ptr的結果是否相同?其中ptr為同一個指針.(void *)ptr 和 (*(void*)ptr值是相同的2:int main() int x=3; print

51、f("%d",x); return 1; 問函數既然不會被其它函數調用,為什么要返回1?mian中,c標準認為0表示成功,非0表示錯誤。具體的值是某中具體出錯信息1,要對絕對地址0x100000賦值,我們可以用(unsigned int*)0x100000 = 1234;那么要是想讓程序跳轉到絕對地址是0x100000去執行,應該怎么做?*(void (*)( )0x100000 ) ( );首先要將0x100000強制轉換成函數指針,即:(void (*)()0x100000然后再調用它:*(void (*)()0x100000)();用typedef可以看得更直觀些:t

52、ypedef 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,輸出的是int,最高位為1,是負數,所以它的值就是0x00的補碼就是128,所以輸出128。這兩道題都是在考察二進制向int或uint轉換時的最高位處理。分析下面的

53、程序: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(); 問輸出結果是什么?希望大家能說說原因,先謝謝了輸出str is world。free 只是釋放的str指向的

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

55、作系統,因此你是可以繼續訪問這塊地址的,只不過。樓上都說過了,最好別這么干。char a10,strlen(a)為什么等于15?運行的結果i nclude "stdio.h"i nclude "string.h"void main()char aa10;printf("%d",strlen(aa);sizeof()和初不初始化,沒有關系;strlen()和初始化有關。char (*str)20;/*str是一個數組指針,即指向數組的指針*/char *str20;/*str是一個指針數組,其元素為指針型數據*/long a=0x801010;a+5=?0x801010用二進制表示為:“1000 0000 0001 0000 0001 0000”,十進制的值為

溫馨提示

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

評論

0/150

提交評論