[問題] C++ 陣列在呼叫函式中sizeof的值不一樣

看板C_and_CPP作者 (萬里無雲萬里天)時間11年前 (2013/07/10 15:09), 編輯推噓2(2051)
留言53則, 9人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux g++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 在main中用sizeof 抓陣列的大小是預期的結果 但為什麼在呼叫的函式中用sizeof對同一個陣列大小的輸出值不一樣呢 若說回傳的是pointer的大小 那麼array name 其實是一個pointer 為什麼 sizeof(a) 和sizeof(*a)的值也不一樣呢 餵入的資料(Input): int a[10] 預期的正確結果(Expected Output): size of a = 40 size of pointer a = 4 size of a using getSize = 40 size of pointer a using getSize = 4 錯誤結果(Wrong Output): size of a = 40 size of pointer a = 4 size of a using getSize = 8 size of pointer a using getSize = 4 程式碼(Code):(請善用置底文網頁, 記得排版) #include <iostream> using namespace std; void getSize(int []); int main() { int a[10]; cout << "size of a = "<< sizeof(a) << endl; cout << "size of pointer a = " << sizeof(*a) << endl; getSize(a); return 0; } void getSize(int array[]) { cout << "size of a using getSize = " << sizeof(array) << endl; cout << "size of pointer a using getSize = " << sizeof(*array) << endl; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 67.169.183.176

07/10 15:15, , 1F
我按照的你程式碼,測出來是40 4 4 4耶
07/10 15:15, 1F

07/10 15:18, , 2F
我沒記錯的話,傳一維陣列會被當成指標,不含有長度
07/10 15:18, 2F

07/10 15:19, , 3F
板底的第十二戒看看吧?我想應該是那個
07/10 15:19, 3F

07/10 15:19, , 4F
如果你的getsize是要傳陣列的話,你就用樣板吧
07/10 15:19, 4F

07/10 15:22, , 5F
我也是40 4 4 4
07/10 15:22, 5F

07/10 15:23, , 6F
那個8和我的作業系統是64 bit有關嗎?
07/10 15:23, 6F

07/10 15:24, , 7F
爬文看到有人說32 bit和64 bit會不一樣
07/10 15:24, 7F

07/10 15:25, , 8F
函數參數的最外那層陣列都會被轉成普通指標
07/10 15:25, 8F

07/10 15:25, , 9F
64bit ubuntu 結果跟原PO一樣
07/10 15:25, 9F

07/10 15:26, , 10F
c++的sizeof是編譯的時候算出來的
07/10 15:26, 10F

07/10 15:26, , 11F
我是64bit W7,可能我編譯器設定沒是64的程式
07/10 15:26, 11F

07/10 15:26, , 12F
他無從得知getSize()的array到底有多大
07/10 15:26, 12F

07/10 15:28, , 13F
az大 像我的參數只有一個陣列 那它就是最外層的嗎
07/10 15:28, 13F

07/10 15:28, , 14F
07/10 15:28, 14F

07/10 15:28, , 15F
是的
07/10 15:28, 15F

07/10 15:30, , 16F
template<class T,int size>v..e(T (&array)[size])
07/10 15:30, 16F

07/10 15:30, , 17F
az大您方便再講得詳細一些嗎 我好像比較懂了 但還是不
07/10 15:30, 17F

07/10 15:31, , 18F
清楚為什麼 sizeof(a)和sizeof(*a)值不一樣
07/10 15:31, 18F

07/10 15:31, , 19F
這樣子應該會對,吧。size就是長度,可以傳double陣列
07/10 15:31, 19F

07/10 15:33, , 20F
template那一行看不懂 (拍謝 小弟實在太菜了 囧..)
07/10 15:33, 20F

07/10 15:33, , 21F
一個是指標的大小,一個是指標指向的東西的大小,吧。
07/10 15:33, 21F

07/10 15:34, , 22F
喔喔,當成沒有那行發生過,之後你就會遇到了。
07/10 15:34, 22F

07/10 15:35, , 23F
那個v..e純粹就是打不下void getSize(被巴)
07/10 15:35, 23F

07/10 15:36, , 24F
XD 我好像比較懂了 是說陣列名稱這個指標大小是8
07/10 15:36, 24F

07/10 15:37, , 25F
但指向陣列名稱的那個指標大小只有4 這樣對嗎?
07/10 15:37, 25F

07/10 15:39, , 26F
不是吧。a是指標,但*a是int。
07/10 15:39, 26F

07/10 15:40, , 27F
指標大小不變喔。但因為你加上*,表示sizeof的東西不是
07/10 15:40, 27F

07/10 15:40, , 28F
標,而是該指標所指向的東西。
07/10 15:40, 28F

07/10 15:41, , 29F
喔喔soga 那方便解釋一下為什麼*a是int嗎? (鞠)
07/10 15:41, 29F

07/10 15:42, , 30F
int大小是4就合理了
07/10 15:42, 30F

07/10 15:42, , 31F
咦,你不是宣告int a[10]嗎
07/10 15:42, 31F

07/10 15:45, , 32F
嗯嗯 感覺快懂了 讓我再想想 謝謝兩位a大 <(_ _)>
07/10 15:45, 32F

07/10 15:45, , 33F
我想你可能得搞清楚陣列跟指標之間的關係?
07/10 15:45, 33F

07/10 15:47, , 34F
您說對了 我再仔細看一下書上怎麼寫的 先謝啦~
07/10 15:47, 34F

07/11 02:25, , 35F
基本上你要瞭解array只是比較方便的pointer而已.當你
07/11 02:25, 35F

07/11 02:26, , 36F
declare int a[10], a就是array的base address, 然後
07/11 02:26, 36F

07/11 02:28, , 37F
int是4 bytes, 所以base address+4 byte就是a[1].只要
07/11 02:28, 37F

07/11 02:29, , 38F
記住a[k] = *(a+k)就很明瞭了.sizeof(a)是pointer大小
07/11 02:29, 38F

07/11 02:30, , 39F
sizeof(*a)事實上是sizeof(a[0])的大小,所以為4因為
07/11 02:30, 39F

07/11 02:31, , 40F
a[0]存的是int.要知道array所需記憶體的大小建議你可
07/11 02:31, 40F

07/11 02:34, , 41F
以看看vector implementation.除非你知有幾個element
07/11 02:34, 41F

07/11 02:35, , 42F
在array裡才有辦法malloc正確的空間.所以通常都會有
07/11 02:35, 42F

07/11 02:36, , 43F
logLength來追蹤array的長度.
07/11 02:36, 43F

07/11 09:32, , 44F
感謝m大 你的回答讓我豁然開朗啊!
07/11 09:32, 44F

07/11 23:26, , 45F
都幾年了還在那邊... array不是指標! 不要誤導別人!
07/11 23:26, 45F

07/11 23:27, , 46F
關鍵字 "array decay pointer" 下去找就有了
07/11 23:27, 46F

07/12 00:25, , 47F
原PO還是照版主說得去查一次吧 不然你會後悔
07/12 00:25, 47F

07/12 12:30, , 48F
這個說起來,這個例子有點麻煩XD
07/12 12:30, 48F

07/12 12:31, , 49F
按照命名來說,array是指標,a反而是陣列。
07/12 12:31, 49F

07/13 02:42, , 50F
謝謝版主大人的回答 查了之後清楚很多
07/13 02:42, 50F

07/16 00:37, , 51F
個人不是很認同MAT說的 array只是比較方便的pointer
07/16 00:37, 51F

07/16 00:38, , 52F
用退化這詞 會比較好 不然你很難去解識為什麼 a[][]
07/16 00:38, 52F

07/16 00:38, , 53F
不能拿來直接當參數傳遞
07/16 00:38, 53F
文章代碼(AID): #1HtGYMnU (C_and_CPP)