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