作者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