[問題] 請問一個指標問題

看板C_and_CPP作者 (GSR600~)時間15年前 (2010/03/05 20:55), 編輯推噓9(9032)
留言41則, 8人參與, 最新討論串1/1
各位好 我在網路上看到一個題目 下面程式碼compiler有過 執行結果為印出5 int main(void) { int *a,*b; a = (int *)1; b = (int *)1; printf(”%d\n”,a+(int)b); return 0; } 我不是很了解a+(int)b正確答案是: 1 + sizeof(*a)*(int)b = 1 + 4*1 = 5; 實際上跑的結果是這種解釋沒錯 a+(int)b到底可以怎樣解釋?? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.34.11

03/05 20:58, , 1F
指標的 offset,類似 address of a[1]
03/05 20:58, 1F

03/05 21:32, , 2F
樓上正解
03/05 21:32, 2F

03/05 21:39, , 3F
還是不太懂...有大大能解釋清楚一點嗎???
03/05 21:39, 3F

03/05 21:44, , 4F
指標 + 整數 = 往前/後 指幾個元素, 因為儲存不同元素
03/05 21:44, 4F

03/05 21:45, , 5F
所需要的空間不一樣, 所以實際上位移的byte數也不同
03/05 21:45, 5F

03/05 21:54, , 6F
你要很清楚指標與陣列的關係
03/05 21:54, 6F

03/06 01:02, , 7F
為什麼是5 而不是其他數字?
03/06 01:02, 7F

03/06 01:13, , 8F
sizeof(*a) = sizeof(int) = 4
03/06 01:13, 8F

03/06 01:27, , 9F
補充, 這樣的答案是在int為32bits的開發平台/環境上:)
03/06 01:27, 9F

03/06 01:27, , 10F
基本上這題答案應該是platform dependent的才對@_@"
03/06 01:27, 10F

03/06 01:47, , 11F
[可以編譯] FreeBSD/i386 system compiler
03/06 01:47, 11F

03/06 01:47, , 12F
[無法編譯] FreeBSD/amd64 system compiler
03/06 01:47, 12F

03/06 01:48, , 13F
請問為什麼會這樣, 感謝
03/06 01:48, 13F

03/06 01:50, , 14F
建議附上錯誤訊息
03/06 01:50, 14F

03/06 01:52, , 15F
[printf那行] cast from 'int*' to 'int' loses precision
03/06 01:52, 15F

03/06 01:53, , 16F
感謝J大提醒
03/06 01:53, 16F

03/06 01:57, , 17F
把%d改成%ld或者%p應該就會過了 (我猜)
03/06 01:57, 17F

03/06 02:11, , 18F
剛試過 %ld 和 %p 還是都不行(錯誤訊息相同) ^^
03/06 02:11, 18F

03/06 02:19, , 19F
vc ok阿 那改成 int(a+(int)b) 呢?
03/06 02:19, 19F

03/06 02:24, , 20F
回Q大, 這樣會跑出兩個上面我寫的錯誤訊息 ^^
03/06 02:24, 20F

03/06 02:26, , 21F
[補充] 我是用 g++ xxx.cpp 的方式編譯
03/06 02:26, 21F

03/06 02:27, , 22F
[補充] 兩台機器的g++版本都是:
03/06 02:27, 22F

03/06 02:27, , 23F
[補充] gcc version 4.2.1 20070719 [FreeBSD]
03/06 02:27, 23F

03/06 02:31, , 24F
那行 你貼的 loses precision 會error? 感覺只是warning阿
03/06 02:31, 24F

03/06 02:33, , 25F
printf(”%d\n”,a+(long)b); 這樣就可以了
03/06 02:33, 25F

03/06 02:33, , 26F
因為在64位元的機器上 指標與long都是64bit 而int是32
03/06 02:33, 26F

03/06 02:33, , 27F
是寫 error: cast from 'int*' to 'int' loses precision
03/06 02:33, 27F

03/06 02:35, , 28F
或許是 VictorTom 大提到的 platform dependent
03/06 02:35, 28F

03/06 02:36, , 29F
因為無法編譯的那台機器是 amd64
03/06 02:36, 29F

03/06 02:42, , 30F
回james732大, a+(long)b 這樣真的就可以了, 真的很感謝您
03/06 02:42, 30F

03/06 07:55, , 31F
那就是這樣沒錯了 64-bit 的機器上指標就是 64-bit
03/06 07:55, 31F

03/06 12:46, , 32F
順便筆記一下, 小弟一直以為不同bit的平台int一定會
03/06 12:46, 32F

03/06 12:46, , 33F
match pointer的size, 看起來64bit的int還是32bit,
03/06 12:46, 33F

03/06 12:46, , 34F
long才會是64 bit; 只是有點好奇那long long會....??
03/06 12:46, 34F

03/06 13:04, , 35F
基本上都是看compiler開發者開心 印象中long long
03/06 13:04, 35F

03/06 13:04, , 36F
有保證一定會64bit在C99還哪個標準裡?
03/06 13:04, 36F

03/06 13:04, , 37F
long 則只保證至少有32bit
03/06 13:04, 37F

03/06 15:03, , 38F
在我那台機器上(amd64), long 和 long long 都是64-bit ^^
03/06 15:03, 38F

03/06 15:29, , 39F
根據個人經驗...真的不要對那些東西做太多假設...
03/06 15:29, 39F

03/06 15:30, , 40F
真的需要xxx bit的話請用stdint.h裡面的型別
03/06 15:30, 40F

03/06 15:32, , 41F
需要跟ptr一樣大的話裡面也有intptr_t跟uintptr_t可以用
03/06 15:32, 41F
文章代碼(AID): #1BaFysZs (C_and_CPP)