2007
08-14

我为了测试用指针写的两个排序程序速度的快慢,用循环自动增加数据记录,在200以内能正常显示和排序,加到500条就有时会出错,特别是第二打开数据文件,加到1000直接出乱码,加到10000条更不可能了,连文件都存出错了.请问是为什么?C对使用的文件大小有限制吗?可也就几十千K呀!


环境:windows2003+wintc8.0


C的致命问题》有 8 条评论

  1. xstar 说:

    检查你的排序算法里面是否有访问越界问题。

     

  2. myes001 说:

    [QUOTE=xstar]

    检查你的排序算法里面是否有访问越界问题。

     

    [/QUOTE]

    =========================================

    谢谢您的回复!问题在排序之前就出错,我用的是一个结构体,链表加指针,结构体内有两个char型和5个float型,为了减少出错,我将两个字符串型用原始值不变,后5个float型自动累加,并相加赋值给另一个float型total,排序就以这个total为准.在生存数据时,到2000多就好像进入了死循环似的,好慢,最后就不动了.就是将上限设到500条时,倒是能生成,先不排序,打开浏览后面也出现乱码,如:0.0000000000000000000000000000000之类的数据,不知为什么?

  3. xstar 说:

    1、检查所有的数据是否都已经初始化了?
    2、检查计算过程中float是否出现溢出情况?
    3、指针操作是否正确呢?

    以下是做测试的一个程序(排序的没写,内存分配和初始化都正确的,环境是Win2K3 + VC6)
    [code]
    #include <stdio.h>
    #include <stdlib.h>

    #include <time.h>

    #define MAXNR   1000000
    #define NUMBASE 6
    typedef struct tagDemo {
        char chName;
        char chExt;
        float f1;
        float f2;
        float f3;
        float f4;
        float f5;
        float total;
        struct tagDemo *next;
    } DEMO;

    DEMO *GetData( DEMO **DemoPtrPtr, int number )
    {
     DEMO *TmpPtr;

     TmpPtr  = (DEMO *)NULL;

     if( number > 0 ) {
      *DemoPtrPtr         = (DEMO *)new DEMO;
      (*DemoPtrPtr)->next = (DEMO *)NULL;
      TmpPtr              = *DemoPtrPtr;
     }

     for( int i = 1; i < number; i++ ) {
      TmpPtr->next = (DEMO *)new DEMO;
      TmpPtr       = TmpPtr->next;
      TmpPtr->next = (DEMO *)NULL;
     }

     return *DemoPtrPtr;
    }

    void FreeData( DEMO *DemoPtr )
    {
     DEMO *TmpPtr;

     while( DemoPtr != (DEMO *)NULL ) {
      TmpPtr = DemoPtr->next;
      delete DemoPtr;
      DemoPtr = TmpPtr;
     }
    }

    void InitData( DEMO *DemoPtr )
    {
     DEMO *TmpPtr;
     
     TmpPtr = DemoPtr;

     srand( time(NULL) );

     while( TmpPtr != (DEMO *)NULL ) {
      TmpPtr->f1    = (float)( rand() % NUMBASE );
      TmpPtr->f2    = (float)( rand() % NUMBASE );
      TmpPtr->f3    = (float)( rand() % NUMBASE );
      TmpPtr->f4    = (float)( rand() % NUMBASE );
      TmpPtr->f5    = (float)( rand() % NUMBASE );

      TmpPtr->total = TmpPtr->f1 + TmpPtr->f2 + TmpPtr->f3 + TmpPtr->f4 + TmpPtr->f5;

      TmpPtr        = TmpPtr->next;
     }
    }

    void SortData( DEMO **DemoPtrPtr )
    {
    }

    void PrintData( DEMO *DemoPtr )
    {
     DEMO *TmpPtr;
     
     TmpPtr = DemoPtr;

     while( TmpPtr != (DEMO *)NULL ) {
      printf( "%f\n", TmpPtr->total );

      TmpPtr        = TmpPtr->next;
     }
    }

    int main()
    {
     DEMO *DEMOPtr = (DEMO *)NULL;

     GetData( &DEMOPtr, MAXNR );

     InitData( DEMOPtr );
     PrintData( DEMOPtr );

     SortData( &DEMOPtr );
     PrintData( DEMOPtr );

     FreeData( DEMOPtr );
     DEMOPtr = (DEMO *)NULL;

     return 0;
    }
    [/code]

  4. myes001 说:

    可能跟编译模式有关,我选特大存贮模式,目前生存,打开,排序6000条数据没有问题.更多的数据我就没敢试了.但是也要在关闭这个dos程序再运行才正常,否则内存申请累加到400多条记录就又失败了.难道在一个模块运行之后用free(head)不能完全释放内存,非得退出程序才行?

  5. myes001 说:

    你的void FreeData( DEMO *DemoPtr )应该对我有启发,用free(head)不行吗?

  6. xstar 说:

    free(head)的话只释放了头指针指向的内存块!malloc和free是一一对应的,你做了多少次的malloc你就需要进行多少次的free。

    另外DOS系统需要注意支持的内存大小,你可以算算你的程序到底用了多少内存!

  7. myes001 说:

    谢谢您的指导

  8. bianker 说:

    路过

留下一个回复