[問題] 請問宣告一個陣列,存取超過陣列大小的 …

看板C_and_CPP (C/C++)作者 (風)時間16年前 (2009/03/17 01:23), 編輯推噓2(209)
留言11則, 3人參與, 最新討論串1/1
今年交大考了一題程式,我在trace的時候怎麼看都是會超過陣列大小 在第11行的地方(連括號也算)if(k>=a[j])break; 那個a[j]在i=3的時候就超過9了,我一直覺得很納悶,就用電腦跑跑看 可是竟然每次執行的結果都一樣,難道宣告陣列超出一點大小的內容有某種規則嗎 雖然不會是一回事可是我蠻好奇為甚麼的,想請教一下有沒有人知道 附程式如下: #include<stdio.h> #include<conio.h> void foo(int *a, int r, int n) { int k=a[r]; int j; for(j=2*r;k<=n;j*=2) { if(j<n) if(a[j]<a[j+1])j++; if(k>=a[j])break; a[j/2]=a[j]; } a[j/2]=k; } int b[10]={4,7,1,5,15,12,9,6,3,8}; int n=10; int main(void) { int i; for(i=n/2;i>=1;i--) foo(b,i,n); for(i=0;i<10;i++) printf("%d\t",b[i]); getch(); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.169.79.23

03/17 01:38, , 1F
看起來好像是個heap...
03/17 01:38, 1F

03/17 01:42, , 2F
所以這是理所當然要會的喔,對不起問了笨問題,但是為何
03/17 01:42, 2F

03/17 01:43, , 3F
執行的結果會出現一些奇怪的數字呢? ps.看這個有技巧嗎
03/17 01:43, 3F
※ 編輯: worldxxi 來自: 118.169.79.23 (03/17 01:58)

03/17 08:25, , 4F
有奇怪的數字就不應該是正確的程式了 :(
03/17 08:25, 4F

03/17 08:25, , 5F
這題我寫了3個答案 分別假設他的陣列是1~10,0~10
03/17 08:25, 5F

03/17 08:26, , 6F
及for(j=2*r;k<=n;j*=2)可能是for(j=2*r;j<=n;j*=2)的情形
03/17 08:26, 6F

03/17 08:27, , 7F
不過不管是0~10的陣列索引還是1~10都會出界
03/17 08:27, 7F

03/17 08:28, , 8F
由for(i=n/2; i>=1; i--) 假設他是1~10,但下面又0~10 ...
03/17 08:28, 8F

03/17 08:29, , 9F
所以不論是0~9 , 1~10在`k<=n`的程式碼都會有不正確的答案
03/17 08:29, 9F

03/17 08:34, , 10F
這個foo看起來確實是shiftdown
03/17 08:34, 10F

03/17 15:22, , 11F
假使真是heap的shiftdown,那麼他的k<=n就是筆(指)誤
03/17 15:22, 11F
文章代碼(AID): #19lehtLz (C_and_CPP)
文章代碼(AID): #19lehtLz (C_and_CPP)