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

  • 问题

  • 有如下一段使用了“堆排序”的C程序:当我执行完“case 1”后,直接执行“case 4”,并赋值key=10,但不知为什么像这样执行完“case 4”后,全局变量“n”会莫名其妙地变到97,如果这时再执行“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;
     for (i=m/2; i>0; i--) HeapCreate (SR,i,m);
     for (i=m; i>1; i--)
     {
      e=SR[i];
      SR[i]=SR[1];
      SR[1]=e;
      HeapCreate (SR,1,i-1);
     }
    }
    void HeapEdit (int a[], int j, int key)
    {
     a[j]=key;
        HeapSort (a, n);
     printf ("\n修改完毕!\n");
    }
    void HeapInsert (int a[], int key, int t)
    {
     t=t+1;
     n=t;
     a[t]=key;
        HeapSort (a, t);
     printf ("\n插入完毕!\n");
    }

    void main ()
    {
     int market=1, t, i, j, key;
     printf ("排队取号程序\n");
     while (market)
     {
      printf ("1、排队初始化\n");
      printf ("2、输出取号\n");
      printf ("3、修改排队数据\n");
      printf ("4、插入排队数据\n");
      printf ("请选择:");
      scanf ("%d", &t);
      printf ("\n");
      switch (t)
      {
      case 1:
       HeapSort (A, N);
       printf ("初始化完毕!\n");
       break;
      case 2:
       printf ("排队取号结果如下:\n");
       for (i=1; i<=n; i++)
       {
        printf ("%3d %6d", i,A[i]);
        printf ("\n");
       }
       break;
      case 3:
       printf ("输入所修改数据序号:");
       scanf ("%d",&j);
       printf ("输入所修改数据:");
       scanf ("%d", &key);
       HeapEdit (A, j, key);
       break;
      case 4:
       printf ("输入所插入数据:");
       scanf ("%d", &key);
       HeapInsert (A, key, n);
       break;
      default:
       break;
      }
      printf ("是否返回(1或0):");
      scanf ("%d", &market);
      printf ("\n");
     }
    }

    • 已编辑 梦天 2009年8月1日 3:53
    2009年7月31日 16:39

答案

  • 你输入10的话在HeapInsert里面取了A[11],而你的A最大只能取到A[10],导致内存越界.

    如果你用的是MS的编译器的话,因为内存是连续的,A[11]对应的恰好是全局变量n.

    0xBAADF00D
    • 已标记为答案 梦天 2009年8月1日 12:23
    2009年8月1日 7:07
    版主
  • 把你的A数组加大,把N设大点.就不会越界改到n了.
    #define N 11
    int A[N+1]={0,49,8,65,97,76,13,27,49,97,83, ???};

    至于A加大后那个???填什么那是你的事了.


    0xBAADF00D
    • 已标记为答案 梦天 2009年8月1日 12:23
    2009年8月1日 11:38
    版主

全部回复

  • 你输入10的话在HeapInsert里面取了A[11],而你的A最大只能取到A[10],导致内存越界.

    如果你用的是MS的编译器的话,因为内存是连续的,A[11]对应的恰好是全局变量n.

    0xBAADF00D
    • 已标记为答案 梦天 2009年8月1日 12:23
    2009年8月1日 7:07
    版主
  • 那能否用一些改进的方法?谢谢!
    2009年8月1日 9:34
  • 把你的A数组加大,把N设大点.就不会越界改到n了.
    #define N 11
    int A[N+1]={0,49,8,65,97,76,13,27,49,97,83, ???};

    至于A加大后那个???填什么那是你的事了.


    0xBAADF00D
    • 已标记为答案 梦天 2009年8月1日 12:23
    2009年8月1日 11:38
    版主