[問題] 求問一題指標題輸出
開發平台(Platform): (Ex: Win10, Linux, ...)
macOS
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
VS code
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
無
問題(Question):
求輸出
餵入的資料(Input):
無
預期的正確結果(Expected Output):
不知道
錯誤結果(Wrong Output):
沒有錯誤結果
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
https://pastebin.com/J3ysYEgV
int main(){
int a[5] = {1, 2, 3, 4, 5};
int *p = (int *)(&a + 1);
printf("%d, %d",*(a+1), (*p-1));
return 0;
}
補充說明(Supplement):
最近在讀C,看到這一題,
熊熊看看不出端倪,於是餵進去試跑看看,
輸出是2, 0,
但上網找,大家都說答案是2,5
第一個是2沒什麼爭議,有點不太懂為什麼第二個輸出是5,我比較認同我的編譯器XD
我對int *p = (int *)(&a+1);的理解是這樣:取得a這個地址再加1內的值,
而1為int,所以應該是加上4個bytes,
不過,a本身就是一個指標,&a不就是指標的指標嗎?但是沒有特別去宣告這個指標的指標
所以應該會不合法,因此輸出為0合情合理,
但網路上的答案都說是5,
解釋是:可把a[5]當成一個二維陣列,只存放一個element,
意即:int a可看成{{1,2,3,4,5}}
所以&a是這個 ^
{{1,2,3,4,5}}
而&a+1是這個 ^
因為沒有第二個element,所以答案是5
也點摸不著頭緒啊!!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.160.241.74 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1626962916.A.D4B.html
→
07/22 22:28,
4年前
, 1F
07/22 22:28, 1F
→
07/22 22:28,
4年前
, 2F
07/22 22:28, 2F
所以應該要馬undifine要馬0是嗎?
※ 編輯: ericerix (118.160.241.74 臺灣), 07/22/2021 22:31:31
→
07/22 23:32,
4年前
, 3F
07/22 23:32, 3F
→
07/22 23:36,
4年前
, 4F
07/22 23:36, 4F
→
07/23 00:37,
4年前
, 5F
07/23 00:37, 5F
→
07/23 00:38,
4年前
, 6F
07/23 00:38, 6F
我不太清楚為什麼需要加上轉型
我其實是不知道為什麼編譯器出來會是0,而網路上大家會說是5,
我認為應該是超界,但我不知道會是什麼答案(超界該怎麼表示?)
※ 編輯: ericerix (118.160.241.74 臺灣), 07/23/2021 00:59:11
※ 編輯: ericerix (118.160.241.74 臺灣), 07/23/2021 01:13:04
我稍微查了一下,
大概是說a是array第一個element的位址,
而&a是這個array的位址,
所以a, &a是一樣的,
pointer如果去+1會是加上這個結構的大小,
所以a+1應會加上4個bytes,也就是到達&a[1],
而&a+1,因為&a代表整個array的頭的位址,+1下去會加上整個結構的大小,
所以在這個case會加上20個bytes,也就是會到達類似&a[5]的位址,
會超出a的界線。
但這題是在問,這個位址的內容物大小是多少,
但是我根本不知道超界之後的位址內容長怎樣,要如何作答?
照著一樓大大的網址來看,內容應該是全為ff..f?不太清楚
另外我也不知道為何int *p = (int *)(&a+1);這裡需要轉型
還請高手們替我解答
謝謝大家!
※ 編輯: ericerix (118.160.241.74 臺灣), 07/23/2021 01:21:01
→
07/23 01:19,
4年前
, 7F
07/23 01:19, 7F
這樣看起來合理多了XDD 看來是我抄題抄錯了(?
不然超界的位址是多少誰知道呢
※ 編輯: ericerix (118.160.241.74 臺灣), 07/23/2021 01:22:53
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章