作者o5739201 (車貸學貸付二貸)
看板Grad-ProbAsk
標題計組 98台大電機
時間Wed Dec 12 17:02:13 2018
https://i.imgur.com/s2nI9eU.jpg
怎麼想都感覺怪怪的 為什麼會是用減的 ?
是因為用malloc配置的空間是stack嗎?
-----
Sent from JPTT on my iPhone
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 110.26.161.96
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Grad-ProbAsk/M.1544605335.A.904.html
1F:推 eggy1018: Malloc Pointer放在Stack , pointer 指向的data 放在hea 12/12 18:08
2F:→ eggy1018: p 12/12 18:08
3F:→ eggy1018: 如果有錯還請大大指教 12/12 18:08
4F:推 alan23273850: 地址由上往下遞增,stack往下長,heap往上長,這樣 12/12 20:35
5F:→ alan23273850: 你就懂了,倒是為什麼 64-bit CPU 的整數是 8 bytes 12/12 20:35
6F:→ alan23273850: 這我還不懂,我以為整數最長就只到 32 bits。 12/12 20:36
7F:推 eggy1018: 64bit=8byte 因為byte address, 所以是+-8 12/12 22:25
8F:推 Dora5566: 蛋大應該是對的 12/12 22:55
9F:推 alan23273850: 我剛剛在WSL上印sizeof(int)明明是4,到底為什麼是8 12/12 23:38
10F:→ alan23273850: 是64bit的電腦喔 12/12 23:39
11F:→ alan23273850: 大家要不要把自己sizeof(int)的結果截圖PO上來參考 12/12 23:41
12F:推 b0920075: int在32 64下都是4byte啊 12/12 23:44
13F:→ b0920075: 但是在64下地址所佔空間是8byte,跟int所佔空間根本無 12/12 23:45
14F:→ b0920075: 關 12/12 23:45
15F:推 b0920075: 這題應該只是考stack生長方向和 64bit下地址所佔空間而 12/12 23:49
16F:→ b0920075: 已 12/12 23:49
17F:→ o5739201: 謝謝各位大大 懂了 12/12 23:53
19F:→ alan23273850: 明明就是 +8,雖然我承認有被 &p 騙到 12/13 00:34
20F:→ alan23273850: 而且p和q都是區域變數放在stack,stack往下長,地址 12/13 00:36
21F:→ alan23273850: 愈往下愈大,這樣不是本來就是 +8 嗎 12/13 00:36
22F:→ alan23273850: 我在不被 &p 騙到的情況下還是答錯 12/13 00:37
25F:→ eggy1018: 抱歉我也不是很理解為什麼你的address會如此,還有待高 12/13 00:59
26F:推 eggy1018: 手回答了 12/13 01:00
27F:→ alan23273850: 這題真是太好玩了,那蛋大對+8還是-8有理論解釋嗎? 12/13 01:18
28F:推 eggy1018: 抱歉我的+-8的意思只是移動8沒特別的意思,造成誤會的 12/13 01:45
29F:→ eggy1018: 話很對不起 12/13 01:45
30F:→ DLHZ: 幾byte不是看compiler? 12/13 02:00
31F:→ aggress5566: sizeof(int)是4byte sizeof(size_t)才會跑出8 12/13 03:47
32F:→ aggress5566: 所以pointer type應該是size_t才是 12/13 04:01
33F:推 Dora5566: 是說64bits下存一個int變數花8byte裡面卻只有4byte的資 12/13 07:06
34F:→ Dora5566: 料,是這樣嗎 12/13 07:06
35F:推 alan23273850: DLHZ: 看平台定義常數 12/13 08:14
36F:→ alan23273850: Dora: 被誤導了,這題問的是指標大小,非普通變數 12/13 08:16
37F:→ alan23273850: 大小,請看清楚,所以我才說這題鑑別度低 12/13 08:16
38F:推 Dora5566: 我確實是想問int在64bit時怎麼放的 XDD 12/13 08:36
39F:推 alan23273850: 上面有人說過了,sizeof(int) 還是 4 12/13 08:39
40F:推 Dora5566: 但64bits不是用8byte對齊嗎 12/13 08:44
41F:推 Dora5566: 啊…我知道了 12/13 08:50
42F:推 alan23273850: 剩下就是加減的問題了,這題拿去申複搞不好會送分 12/13 09:31
43F:→ o5739201: 所以是用加的嗎?stack往下長 下面不是位置比較低嗎? 12/13 10:12
44F:→ o5739201: 我用dev-c去試 是用減的沒錯 12/13 10:23
45F:→ o5739201: Compiler 是 TDM-GCC 4.9.2 64bit 12/13 10:23
46F:→ aggress5566: 這個問題就是 如果是4 byte 要怎麼表示 64 bit addr 12/13 12:43
47F:推 b0920075: stack是往下長,但local變數擺放順序C語言規格書沒有強 12/13 13:30
48F:→ b0920075: 制規定,很多compiler會為了安全考量,更改變數擺放位置 12/13 13:32
49F:推 alan23273850: 這題根本就有問題,可以把解答全部貼出來嗎 12/13 13:32
50F:推 b0920075: 喔,還有可能因為空間利用上的關係改變變數順序 12/13 13:34
51F:推 b0920075: 然後stack地址越往下越小,這os應該有教吧 12/13 13:46
52F:→ alan23273850: 可惡,剛查了還真的是愈下面愈小,感謝樓上,受教了 12/13 14:12
53F:→ alan23273850: 這樣的話如果按照預設行為的話答案應該就沒錯了 12/13 14:13
54F:推 eggy1018: 感謝b大a大的討論 小弟受教了 12/13 14:30
55F:→ o5739201: 答案就只有寫這樣哦 已經是全部了 12/13 17:12
57F:→ jjuussttiinn: 我找到的解答是加的欸 12/13 18:51
58F:推 alan23273850: 到底是官方還是非官方的 12/14 13:33
59F:推 ss850423tw: 題目是不是只是問 printf(“%x\n”,&p)這行的addre 12/14 23:33
60F:→ ss850423tw: ss和下一行的address的關係,並不是問p q指標的位置 12/14 23:33
61F:→ ss850423tw: 關係啊 12/14 23:33
62F:推 ss850423tw: 喔喔抱歉 沒看清楚是說那行的 output所以應該是指標 12/14 23:42
63F:→ ss850423tw: 存heap然後heap往上長所以是+8沒錯吧 12/14 23:42
64F:推 b0920075: &p &q都是stack地址,跟heap無關,如果要看heap地址應 12/15 09:12
65F:→ b0920075: 該要看p q 12/15 09:12
66F:→ ss850423tw: 喔嗚了解了謝謝b大 12/15 11:56
67F:推 kobebset105: 回覆alan大大 妳的位址第一個是f所以是負數 12/15 14:56
68F:→ kobebset105: 所以這題是減沒有錯喔 12/15 14:57
69F:推 alan23273850: kobe大大按照你說的,那答案位址b開頭代表sign bit= 12/15 16:58
70F:→ alan23273850: 1,那也是負的,這樣選項就錯了對ㄅ 12/15 16:58
71F:→ alan23273850: 包括蛋大的截圖也是,e開頭也是負的,可是他卻是減 12/15 16:59
72F:噓 aggress5566: 到底在說什麼 Memory Address 什麼時候有負的這種 12/15 20:20