[問題] 副程式(陣列),整數陣列元素個數無法計算,字串可以

看板C_and_CPP (C/C++)作者 (一斤砒霜)時間11年前 (2014/12/22 23:17), 11年前編輯推噓4(4012)
留言16則, 9人參與, 最新討論串1/1
:開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC,debian 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 副程式(陣列),整數陣列元素個數無法計算,字串可以 餵入的資料(Input): int a[]={4,5,6,7} 預期的正確結果(Expected Output): int a[]=4,5,6,7, 錯誤結果(Wrong Output): a[]=4, 程式碼(Code):(請善用置底文網頁, 記得排版) 1 #include <stdio.h> 2 void pntArr(int *a){ 3 int len_a=sizeof(a)/sizeof(int),i; 4 printf("len....%d\n",len_a); 5 printf("a[]="); 6 for(i=0;i<len_a;i++){ 7 printf("%d,",*(a+i)); 8 } 9 } 10 11 int main(){ 12 int a[]={4,5,6,7}; 13 int len_a=sizeof(a)/sizeof(int); 14 pntArr(a); 15 } 補充說明(Supplement): 整數陣列call副程式,查google說是typeof不能計算動態陣列, 看其它類似的代碼都是長度(元素數量)一起傳過去, 我問題是在...我把int []改成char [],就能得到我預期的結果。 ex.. char a[]="abcd"; -- 空空咿咿呀呀%>_<% 咿呀咿呀唷~~~^_^~~~ 咿呀咿呀唷(═﹏═|||)。。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 49.159.164.120 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1419261450.A.47D.html ※ 編輯: mickeyopq (49.159.164.120), 12/22/2014 23:25:52

12/22 23:19, , 1F
推, 值得深思的好問題
12/22 23:19, 1F
※ 編輯: mickeyopq (49.159.164.120), 12/22/2014 23:30:33

12/23 00:09, , 2F
sizeof(*a) 你只有取a[0]來算size
12/23 00:09, 2F
※ 編輯: mickeyopq (49.159.164.120), 12/23/2014 02:24:23

12/23 02:27, , 3F
抱歉,那個是再試的,我做修改了......
12/23 02:27, 3F

12/23 07:04, , 4F
是不是因為傳array到function, function不知物件個數
12/23 07:04, 4F

12/23 07:06, , 5F
然後sizeof(a)計算到pointer的大小
12/23 07:06, 5F

12/23 07:08, , 6F
又剛好你的物件個數是4個
12/23 07:08, 6F

12/23 07:35, , 7F
樓上正解,一般作法是傳入pointer和元素個數
12/23 07:35, 7F

12/23 09:10, , 8F
剛好你的 OS 的 pointer type 大小是 char 的四倍吧 XD
12/23 09:10, 8F

12/23 13:28, , 9F
是說 char a[] = "abcd"; 應該是 5 個 byte 才對
12/23 13:28, 9F

12/23 13:28, , 10F
純粹是他 OS 的 pointer 剛好佔 4 個 byte 而已
12/23 13:28, 10F

12/23 14:24, , 11F
func裡是pointer的Size, main裡是int Array的Size
12/23 14:24, 11F

12/23 14:52, , 12F
謝謝,解了,因為我字串也剛好宣告4個所以看不出來。
12/23 14:52, 12F

12/23 14:53, , 13F
如果我宣告更多a[]="abcdefg",他還是只印4個。
12/23 14:53, 13F

12/23 14:56, , 14F
照上面這邏輯,用質數的長度比較能避免....
12/23 14:56, 14F

12/25 02:17, , 15F
必須傳入陣列大小,而純(strlen)以0為結束
12/25 02:17, 15F

12/26 03:02, , 16F
無論如何都不想多傳一個參數可以考慮把他包成 struct
12/26 03:02, 16F
文章代碼(AID): #1Kc3OAHz (C_and_CPP)
文章代碼(AID): #1Kc3OAHz (C_and_CPP)