看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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 都值得一看。 這題目,如同眾版友所言,不是個好題目。 -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.78.41
priv:其實有沒有68G的記憶體是無所謂,因為都是virtual address 09/23 17:49
priv:但是如果要可以正常存取你必須先allocate這塊記憶體 09/23 17:49
tropical72:嗯嗯,謝謝 priv 指正。 09/23 17:51
priv:另一方面,不見得你想alloc就一定alloc得到,也可能有別人用 09/23 17:53
priv:要考慮一堆platform dependant的東西,實在不是面試好題 09/23 17:54
yolasiku:我印象...BENQ好像有考 09/23 19:24
LPH66:基本上我說這題出爛了的原因是這個題目和原PO所提供的"解答" 09/23 20:32
LPH66:根本就是兩碼子事... 09/23 20:32
legnaleurc:不管是 int * 或 long *,其指標大小不都一樣嗎? 09/25 01:40
legnaleurc:如果被指的位址實際上只有 1 byte 可用呢? 09/25 01:42
tropical72:雖 int* ,long* 大小一樣,但以pointer 寫入目標之 byte 09/25 03:35
tropical72:數未必一樣,也考慮到 1byte 問題,文中才提出 char* 09/25 03:35
legnaleurc:我只是認為這題去討論指標的長度不太有意義 09/25 13:43
legnaleurc:題目既然給了超過32bits的位址, 就代表在機器上一定存 09/25 13:44
legnaleurc:在,而且也一定是用64bits以上的編譯器,如果不是的話 09/25 13:45
legnaleurc:這根本不是code怎麼寫就可以解決的問題,所以問題點應 09/25 13:46
legnaleurc:該是該位址所指向的有效空間到底多大才對吧 ... 09/25 13:47
tropical72:謝謝提點。 09/25 14:40
priv:的確是legnaleurc說的這樣沒錯,問題是答案是錯的XD 09/25 16:28
priv:大家為了一個應該明顯出錯的題目也太認真了XD 09/25 16:29
erotic:請益:2^32=4,294,967,296,0x123456789有超過? 09/25 16:36
james732: 4,886,718,345←0x123456789 09/25 16:45
loveme00835:>>> 2 ** 32 < 0x123456789[Enter] → True 09/25 16:48
priv:呃,看位數就知道超過了吧 09/25 20:36
erotic:我以為0x只是代表123456789為16進位數字 09/25 22:31
priv:16進位最簡單看啊了,兩位數要用一個byte 09/25 22:35
loveme00835:不只 09/25 22:49
erotic:哦,了解,謝謝priv大大的指點 09/25 23:08