首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求以下程序的异常解决方式 关于realloc()对二阶指针的赋值

2012-02-20 
求以下程序的错误解决方式 关于realloc()对二阶指针的赋值请帮我找出下面这个程序执行错误的原因并说明如

求以下程序的错误解决方式 关于realloc()对二阶指针的赋值
请帮我找出下面这个程序执行错误的原因并说明如何修正使它能正确运行
拜托了

C/C++ code
#include <STDIO.H>#include <ALLOC.H>#include <STDLIB.H>#include <IOSTREAM.H>#include <STRING.H>#define BASE_LENGTH 1#define INCREMENT_LENGTH 1#define ID_LENGTH 10#define NAME_LENGTH 10FILE *fp;class Log{public:     long *In_Out;     long *Debit_Credit;     char **ID; //账户号      char **ACName;     char **selfID;     char **selfName;     int Number;     int count;     int maxcount;          Log()     {          Number=-1;          count=-1;          maxcount=BASE_LENGTH-1;          In_Out=(long*)malloc(sizeof(long*)*BASE_LENGTH);          Debit_Credit=(long*)malloc(sizeof(long)*BASE_LENGTH);          ID=(char**)malloc(sizeof(char*)*BASE_LENGTH);          ACName=(char**)malloc(sizeof(char*)*BASE_LENGTH);          selfID=(char**)malloc(sizeof(char*)*BASE_LENGTH);          selfName=(char**)malloc(sizeof(char*)*BASE_LENGTH);          for(int i=0;i<BASE_LENGTH;i++)          {               ID[i]=(char*)malloc(sizeof(char)*ID_LENGTH);               ACName[i]=(char*)malloc(sizeof(char)*NAME_LENGTH);               selfID[i]=(char*)malloc(sizeof(char)*ID_LENGTH);               selfName[i]=(char*)malloc(sizeof(char)*NAME_LENGTH);          }     }     int Input(long in_out, long debit_credit,               char *id, char *acname,               char *selfid, char*selfname)     {          int i;          In_Out[Number]=in_out;          Debit_Credit[Number]=debit_credit;          strcpy(ID[Number],id);          strcpy(ACName[Number],acname);          strcpy(selfID[Number],selfid);          strcpy(selfName[Number],selfname);              for(i=0;i<=Number;i++)          {               if((strcmp(selfID[i],selfid)==0)                  &&                  (strcmp(selfName[i],selfname)!=0))               {                    cout<<"LOGS WRONG\n"<<endl;                    //报错;               }          }     }     int New(long in_out, long debit_credit,             char *id, char *acname,             char *selfid, char*selfname)     {cout<<endl;          if(count == maxcount)          {               In_Out = (long*)realloc(In_Out,sizeof(long)*BASE_LENGTH+INCREMENT_LENGTH);               Debit_Credit = (long*)realloc(Debit_Credit,sizeof(long)*BASE_LENGTH+INCREMENT_LENGTH);                              ID = (char**)realloc(ID,sizeof(char*)*(BASE_LENGTH+INCREMENT_LENGTH));               ACName = (char**)realloc(ACName,sizeof(char*)*(BASE_LENGTH+INCREMENT_LENGTH));               selfID = (char**)realloc(selfID,sizeof(char*)*(BASE_LENGTH+INCREMENT_LENGTH));               selfName = (char**)realloc(selfName,sizeof(char*)*(BASE_LENGTH+INCREMENT_LENGTH));               for(int i=0;i<=INCREMENT_LENGTH;i++)               {                    ID[maxcount+i]=(char*)malloc(sizeof(char*)*ID_LENGTH);                    selfID[maxcount+i]=(char*)malloc(sizeof(char*)*ID_LENGTH);                    ACName[maxcount+i]=(char*)malloc(sizeof(char*)*NAME_LENGTH);                    selfName[maxcount+i]=(char*)malloc(sizeof(char*)*NAME_LENGTH);               }               maxcount+=INCREMENT_LENGTH;          }          count++,Number++;          Input(in_out, debit_credit, id, acname, selfid, selfname);          cout<<"ID[Number] = "<<ID[Number]<<endl;          cout<<"ACName[Number] = "<<ACName[Number]<<endl;          cout<<"selfID[Number] = "<<selfID[Number]<<endl;          cout<<"selfName[Number] = "<<selfName[Number]<<endl;     }          int Save(char *savefile)     {          if( (fp=fopen(savefile,"w")) == NULL)               exit(0);          fprintf(fp,"%d\n",count+1);//给出记录条数          Number = 0;          while(Number != count+1)          {               fprintf(fp, "%ld %ld %s %s %s %s\n",                       In_Out[Number],                       Debit_Credit[Number],                       ID[Number],                       ACName[Number],                       selfID[Number],                       selfName[Number]);               Number++;          }          fclose(fp);          return 1;     }};int main(void){     Log lg1;   //  Card cd1;     lg1.New(111,100,"33#1","asd1","Card0001","WJK");     lg1.New(111,100,"33#2","123212","Card000222","WJS22");     lg1.New(111,100,"33#3","sdasR3","Card0003","WJW");     lg1.New(111,100,"#4","asd1","Card0002","WJS");     lg1.New(111,100,"#5","sds1","Card0001","WJK");     lg1.New(111,100,"#6","zxc1","Card0002","WJK");     lg1.New(111,100,"#7","vzczx1","Card0001","WJK");     lg1.New(111,100,"#8","zzxc1","Card0001","WJK");     lg1.New(111,100,"#9","jhf1","Card0001","WJS");     lg1.Save("Hello.txt");    // cd1.LoadFromLog(lg1);    // cd1.Save("Happy.txt");     system("pause");     return 0;} 



[解决办法]
Number
越界
建议:循环时这么写for(int i=0; i<n; i++)
这样就不要又-1又1的控制和比较了
[解决办法]
因为有内存泄漏吧 Log函数中
for(int i=0;i<BASE_LENGTH;i++)
{
ID[i]=(char*)malloc(sizeof(char)*ID_LENGTH);
ACName[i]=(char*)malloc(sizeof(char)*NAME_LENGTH);
selfID[i]=(char*)malloc(sizeof(char)*ID_LENGTH);
selfName[i]=(char*)malloc(sizeof(char)*NAME_LENGTH);
}
ID[i]分配了内存,然后New函数中
 for(int i=0;i<=INCREMENT_LENGTH;i++)
{
ID[maxcount+i]=(char*)malloc(sizeof(char*)*ID_LENGTH);
selfID[maxcount+i]=(char*)malloc(sizeof(char*)*ID_LENGTH);
ACName[maxcount+i]=(char*)malloc(sizeof(char*)*NAME_LENGTH);
selfName[maxcount+i]=(char*)malloc(sizeof(char*)*NAME_LENGTH);
}
ID[i]又分配了内存,原来的内存就泄漏了
[解决办法]
int New(long in_out, long debit_credit,
char *id, char *acname,
char *selfid, char*selfname)
{
cout<<endl;
if(count == maxcount)
{
In_Out = (long*)realloc(In_Out,sizeof(long)*BASE_LENGTH+INCREMENT_LENGTH);
Debit_Credit = (long*)realloc(Debit_Credit,sizeof(long)*BASE_LENGTH+INCREMENT_LENGTH);

ID = (char**)realloc(ID,sizeof(char*)*(BASE_LENGTH+INCREMENT_LENGTH)); // !!!!
ACName = (char**)realloc(ACName,sizeof(char*)*(BASE_LENGTH+INCREMENT_LENGTH)); // !!!!
selfID = (char**)realloc(selfID,sizeof(char*)*(BASE_LENGTH+INCREMENT_LENGTH)); // !!!!
selfName = (char**)realloc(selfName,sizeof(char*)*(BASE_LENGTH+INCREMENT_LENGTH)); // !!!!
for(int i=0;i<=INCREMENT_LENGTH;i++)
{
ID[maxcount+i]=(char*)malloc(sizeof(char*)*ID_LENGTH); // !!!!
selfID[maxcount+i]=(char*)malloc(sizeof(char*)*ID_LENGTH); // !!!!
ACName[maxcount+i]=(char*)malloc(sizeof(char*)*NAME_LENGTH); // !!!!
selfName[maxcount+i]=(char*)malloc(sizeof(char*)*NAME_LENGTH); // !!!!
}
maxcount+=INCREMENT_LENGTH;
}
...


// !!!! 标记处,没有考虑多次 realloc 动作,分配空间的参数应当是 BASE_LENGTH+INCREMENT_LENGTH*x (x为realloc次数)

热点排行