精華區beta C_and_CPP 關於我們 聯絡資訊
題目: 給記憶體位址 "0x123456789" 設定其值為0,請寫出其程式碼。 我是寫 int *p; p = 0x123456789; *p = 0; 但是答案是給 long *p; p = (long*)0x123456789; *p = 0; 我想問的是 他不是要assign 0 (整數type) 所以pointer是指向int 那我type用int *有錯嗎? 解答是解釋這題主要是考 溢位整數變數轉換常整數型 的問題 但是pointer不是無論如何(無論指向什麼型態) 他的大小都是4 bytes嗎? 所以int *跟long * 儲存的空間大小不是一樣嗎? 那怎麼會有什麼溢位的問題呢? 以上 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.51.107 ※ 編輯: k0783154 來自: 140.112.51.107 (09/23 10:00)
LPH66:所以這題出爛了.... 09/23 10:29
LPH66:出這題的人根本不知道他出了什麼東西 = = 09/23 10:29
LPH66:不是這個問題吧 這 0x123456789 是給 pointer 的 09/23 10:34
LPH66:誰管它裝不裝得進 long... 09/23 10:34
angleevil:但是我有疑問,可以直接把數值當位置嘛? 09/23 10:39
shadow0326:而且long也不一定裝的下0x123456789吧 09/23 10:48
cutecpu:「設定其值為0」<= 是設定怎樣型態的值為 0 呢XD 09/23 11:07
ledia:可能反問他: "你真的知道自己在問什麼嗎" 就過關了 09/23 11:33
a5480277:真的是出爛了... 09/23 11:55
johnhmj:出題者可能還活在DOS的時代裡 ( ̄ー ̄;) 09/23 14:44
priv:不是吧,DOS的話你是要怎樣直接32-bit定址 09/23 15:14
priv:這題不管用什麼角度看都是錯誤的題目 09/23 15:15
priv:更正,他超過32-bit 09/23 15:15
priv:拿到64bit machine上面,以現代的OS和compiler 09/23 15:17
priv:你只會得到access error的結果吧XD 09/23 15:17
priv:還有如果在VC,long int是32 bit,要long long int才裝得下 09/23 15:18
priv:如果這個是面試的主管自己出的...還是不要去這家公司好了XD 09/23 15:19
priv:而且和原po說的一樣...pointer的size和type size無關 09/23 15:26
angleevil:贊成,不需要去一個不會寫程式主管的公司 09/23 15:27
tropical72:#1DyGJ9Oy 09/23 16:52
這是這本書上面的題目啦 http://www.books.com.tw/exep/prod/booksfile.php?item=0010445260 我想應該是有很多誤刊的地方 所以結論是? 這個地址0x123456789 應該是裝不進 任何pointer的 (以32bit來說) 另外沒有人可以知道記憶體位址 然後還可以assign給某個pointer的 很怪 對了另外想問 目前電腦大多都已經64bit的了 那如果去面試還是會考32bit的考題嗎?以上謝謝大家的討論! ※ 編輯: k0783154 來自: 140.112.4.181 (09/23 17:04)
tropical72:我補一下priv說的,long long int 要寫成.. 09/23 17:43
tropical72:p=(long long int*)0x123456789LL; 09/23 17:43
ariesd:這本書錯誤超多... 09/23 20:08
cgcheng:所以你應該要問對方,你這哪裡抄來的,亂抄一通 09/27 03:03
> -------------------------------------------------------------------------- < 作者: tropical72 (藍影) 看板: C_and_CPP 標題: Re: [問題] 面試題目 - pointer 時間: Fri Sep 23 17:39:09 2011 ※ 引述《k0783154 ( )》之銘言: : 題目: : 給記憶體位址 "0x123456789" 設定其值為0,請寫出其程式碼。 : 我是寫 : int *p; : p = 0x123456789; : *p = 0; : 但是答案是給 : long *p; : p = (long*)0x123456789; : *p = 0; 我只是想引出更多高人對於這題目的看法和討論而已。 嚴格說起,要以指標存入 0x123456789,除非是 64 bits CPU 才可能, 以 sizeof(pointer) 而言,確實在 32bits cpu 下皆為 32bits, 64 bits cpu 下全為 64bits , 無誤, 但下面這段,你不能說它一定是 compile error , 或 runtime error int *p2; p2=(int*)0x0012ff601234; printf("%p\n", p2); 重點在 assigned to p2 那裡,那部份還是要看 compiler 怎麼做, 它可以發出 warnning ,可以發出 error,也可以自己亂搞, 以手邊 32bits 環境, vc 2008 下,它給我的答案是 FF601234, 它只取最後 4 bytes 出來,但難保其它 compiler 也是以這種實做出現, 這部份我認為是在於 compiler 對於字面常量之解釋方式為何。 再回來看這段 long *p; p = (long*)0x123456789; *p = 0; 即使 你的 p 已順利 assig to 0x123456789,那又有個問題了 : 這台電腦作業系統,真的支援到單一程式可開 68 G(0x123456789) 記憶體嗎? 在做 assigned 動作時,其實一切都不會有任何問題 , 即使它指向了一塊違規的記憶體空間,只要你不去讀它、不去寫它, 合理上它是可以這麼做的 (除非 compiler 擋掉), 一旦你開始去讀它或寫它,才會造成所謂的記憶體違規現象, 也即便是第三行的 *p=0 這才會造成違規現象。 嗯,再回到題意,上面都再扣除掉, 它是說寫入 0x123456789 這個位置, 如果是我的話,我不會用 long* , 不會用 int* , 而是用 char* 這樣就不會動到 0x12345678a、0x12345678b、0x12345678c 等位置, 而用 long* 、 int* 會寫到幾個 bytes, 這時必需看 sizeof(long)、sizeof(int) 實際上是幾個 bytes, 至於 sizeof(long) 和 sizeof(int) 到底多大?這是另一個議題, 可看相關系列文 #1DyEsSMY ,所有人的 Reply 都值得一看。 這題目,如同眾版友所言,不是個好題目。