我为了测试用指针写的两个排序程序速度的快慢,用循环自动增加数据记录,在200以内能正常显示和排序,加到500条就有时会出错,特别是第二打开数据文件,加到1000直接出乱码,加到10000条更不可能了,连文件都存出错了.请问是为什么?C对使用的文件大小有限制吗?可也就几十千K呀!
环境:windows2003+wintc8.0
>> 本文固定链接: http://www.vcgood.com/archives/1778
我为了测试用指针写的两个排序程序速度的快慢,用循环自动增加数据记录,在200以内能正常显示和排序,加到500条就有时会出错,特别是第二打开数据文件,加到1000直接出乱码,加到10000条更不可能了,连文件都存出错了.请问是为什么?C对使用的文件大小有限制吗?可也就几十千K呀!
环境:windows2003+wintc8.0
>> 本文固定链接: http://www.vcgood.com/archives/1778
你必须先 登录才能发表评论。
检查你的排序算法里面是否有访问越界问题。
[QUOTE=xstar]
检查你的排序算法里面是否有访问越界问题。
[/QUOTE]
=========================================
谢谢您的回复!问题在排序之前就出错,我用的是一个结构体,链表加指针,结构体内有两个char型和5个float型,为了减少出错,我将两个字符串型用原始值不变,后5个float型自动累加,并相加赋值给另一个float型total,排序就以这个total为准.在生存数据时,到2000多就好像进入了死循环似的,好慢,最后就不动了.就是将上限设到500条时,倒是能生成,先不排序,打开浏览后面也出现乱码,如:0.0000000000000000000000000000000之类的数据,不知为什么?
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]
可能跟编译模式有关,我选特大存贮模式,目前生存,打开,排序6000条数据没有问题.更多的数据我就没敢试了.但是也要在关闭这个dos程序再运行才正常,否则内存申请累加到400多条记录就又失败了.难道在一个模块运行之后用free(head)不能完全释放内存,非得退出程序才行?
你的void FreeData( DEMO *DemoPtr )应该对我有启发,用free(head)不行吗?
free(head)的话只释放了头指针指向的内存块!malloc和free是一一对应的,你做了多少次的malloc你就需要进行多少次的free。
另外DOS系统需要注意支持的内存大小,你可以算算你的程序到底用了多少内存!
谢谢您的指导
路过