[問題] 陣列傳到副程式,為何sizeof結果不一樣?

看板C_and_CPP作者 (嘿嘿...)時間16年前 (2009/12/28 00:43), 編輯推噓4(4016)
留言20則, 6人參與, 最新討論串1/1
遇到的問題: (題意請描述清楚) 為何主程式與副程式傳遞陣列時,其sizeof結果不一致? 希望得到的正確結果: n=30,m=10 n=30,m=10 程式跑出來的錯誤結果: n=30,m=10 n=4,m=10 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) Dev-C++ 有問題的code: (請善用置底文標色功能) #include <stdio.h> #include <stdlib.h> void copy(char c[][10],char d[][10]); int main(void) { int i,j; char a[3][10]={"3333abc","de33f","3333ghgh"}; char b[3][10]; int n=sizeof(a),m=sizeof(a[0]); printf("n=%d,m=%d\n",n,m); copy(a,b); system("pause"); return 0; } void copy(char c[3][10],char d[3][10]) { int i,j=0; int n=sizeof(c),m=sizeof(c[0]); printf("n=%d,m=%d\n",n,m); } 補充說明: 是小弟有思考錯的地方嗎? 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.229.204.29

12/28 00:45, , 1F
可見17977篇(或本板的 #1BDSy4aw)
12/28 00:45, 1F

12/28 00:50, , 2F
補充一下, 實際上copy的參數型態是 char *[10], 所以c解
12/28 00:50, 2F

12/28 00:50, , 3F
出來是pointer的大小, 而c[0]卻可以解出10來....:)
12/28 00:50, 3F

12/28 00:52, , 4F
應該是 char(*)[10]吧 XD
12/28 00:52, 4F

12/28 01:07, , 5F
謝謝j大,所以compiler會唬人? 實際上是傳指標??? >"<
12/28 01:07, 5F

12/28 01:20, , 6F
應該說C語言本來就沒有"傳一個陣列"這回事吧 XD
12/28 01:20, 6F

12/28 01:40, , 7F
就系統的觀點來看,傳一個array是一件很恐怖的事情
12/28 01:40, 7F

12/28 01:41, , 8F
function的參數傳遞過程要塞stack
12/28 01:41, 8F

12/28 01:42, , 9F
如果要傳整個array會變得很麻煩
12/28 01:42, 9F

12/28 01:42, , 10F
所以function call時才會用pointer來代替array的傳遞
12/28 01:42, 10F

12/28 01:57, , 11F
謝n板大, 有沒有()差很多, 然後小弟我每次都忘記....Orz
12/28 01:57, 11F

12/28 02:45, , 12F
話說 我沒看到function呼叫的地方耶 漏貼?functio進去的地方
12/28 02:45, 12F

12/28 02:45, , 13F
式傳遞array 的位址資訊 所以式要加上 *的 @"@
12/28 02:45, 13F
※ 編輯: althon 來自: 61.229.192.122 (12/28 10:03)

12/28 10:03, , 14F
真的是漏貼XD...謝謝!
12/28 10:03, 14F

12/28 10:04, , 15F
所以要傳陣列指標嗎? char(*)[10]????? 
12/28 10:04, 15F

12/28 10:08, , 16F
建議這樣寫可以避免誤解, 因為實際上它傳的就是這樣:)
12/28 10:08, 16F

12/28 10:09, , 17F
謝謝大大~
12/28 10:09, 17F

12/28 10:09, , 18F
然後這種case我每次都會忘記c或d變數名稱要寫在括號的哪
12/28 10:09, 18F

12/28 10:09, , 19F
邊, 每次寫都要開compiler build一下才知道對不對Orz
12/28 10:09, 19F

12/28 10:14, , 20F
我剛剛才想問怎麼放cd變數..原來要放在(*c)[10] XD..謝謝
12/28 10:14, 20F
文章代碼(AID): #1BDuwKox (C_and_CPP)