关于一段C程序中全局变量的BUG

来源:百度知道 编辑:UC知道 时间:2024/06/16 11:05:30
有如下一段使用了“堆排序”的C程序:当我执行完“case 1”后,直接执行“case 4”,并赋值key=10,但不知为什么像这样执行完“case 4”后,全局变量“n”会莫名其妙地变到98,如果这时再执行“case 2”时,就会出错误、非预期结果。这是为什么?望高手指点一二。谢谢!(我用的编译器是Visual studio 2005)

#include<stdio.h>
#define N 10
int A[N+1]={0,49,8,65,97,76,13,27,49,97,83};
int n=N;

void HeapCreate (int SR[],int i,int m)
{
int r, l, largest, e;
l=2*i;
r=2*i+1;
if (l==m)
{
if (SR[l]<=SR[i]) largest=i;
else largest=l;
if (largest != i)
{
e=SR[i];
SR[i]=SR[largest];
SR[largest]=e;
}
}
else if (l<m)
{
if (SR[l]<=SR[r]) largest=r;
else largest=l;
if (SR[i]<=SR[largest]) largest=largest;
else largest=i;
if (largest != i)
{
e=SR[i];
SR[i]=SR[largest];
SR[largest]=e;
HeapCreate (SR, largest, m);
}
}
}
void HeapSort (int SR[], int m)
{
int i, e;

在case 4中,你调用了void HeapInsert (int a[], int key, int t)
函数。
你的A[N+1]是固定的,从0-10有11项。
你插入堆的时候, n+1 为 11,即访问 A[11],既是第12项。已经溢出。而溢出的地方正是n的位置。
在内存中,变量的位置如下:

A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 n
00001111222233334444555566667777888899990000nnnn

A0既是A[0] A10既是A[10].

所以你访问的A[11]的位置正是n的位置。

增加A数组的长度,比如 A[100]. 不要超过100项呀。