看板 C_and_CPP 關於我們 聯絡資訊
今年交大考了一題程式,我在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
LPH66:看起來好像是個heap... 03/17 01:38
worldxxi:所以這是理所當然要會的喔,對不起問了笨問題,但是為何 03/17 01:42
worldxxi:執行的結果會出現一些奇怪的數字呢? ps.看這個有技巧嗎 03/17 01:43
※ 編輯: worldxxi 來自: 118.169.79.23 (03/17 01:58)
sunneo:有奇怪的數字就不應該是正確的程式了 :( 03/17 08:25
sunneo:這題我寫了3個答案 分別假設他的陣列是1~10,0~10 03/17 08:25
sunneo:及for(j=2*r;k<=n;j*=2)可能是for(j=2*r;j<=n;j*=2)的情形 03/17 08:26
sunneo:不過不管是0~10的陣列索引還是1~10都會出界 03/17 08:27
sunneo:由for(i=n/2; i>=1; i--) 假設他是1~10,但下面又0~10 ... 03/17 08:28
sunneo:所以不論是0~9 , 1~10在`k<=n`的程式碼都會有不正確的答案 03/17 08:29
sunneo:這個foo看起來確實是shiftdown 03/17 08:34
sunneo:假使真是heap的shiftdown,那麼他的k<=n就是筆(指)誤 03/17 15:22