一个指针问题弄不明白


一个指针问题弄不明白

出问题的哪一行我用注释表出来了

进到运算符重载的函数以后在最后一步(delete []cnum1)会报错,不知道为什么,把这行注释掉以后又在return a那一行报错,不知道怎么回事,

达人指教!

p.s. 原帖过长,删掉了很多不影响问题的函数定义

//本题肯定有很多问题,只要解决我提出来的这个就好,后面的问题由于这个问题没过我还没发现……囧……


#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
const int MAX = 110;
class CHugeInt
{
private:
       int inum;
       char* cnum;
public:
       CHugeInt(char *num2,int num1=-1):cnum(num2),inum(num1){}
       CHugeInt(int num1,char* num2=NULL):inum(num1),cnum(num2){}
       CHugeInt(const CHugeInt &xxx)
       {
               inum=xxx.inum;
               cnum = new char[strlen(xxx.cnum) + 1];
               strcpy(cnum,xxx.cnum);
       }
       /*
       ~CHugeInt()     {
               if (cnum)
               delete []cnum;
       };
       */
       friend ostream& operator<<( ostream&o,const CHugeInt& xx);
       friend CHugeInt operator+(const CHugeInt& temp,int b);
       friend CHugeInt operator+(int b,const CHugeInt& temp);

CHugeInt operator+(const CHugeInt& temp,int b)
{
CHugeInt a=temp;
if(a.cnum==NULL)
{
       a.inum=b+a.inum;
       return a;
}
else
{
       int i=0;
   int len1=strlen(a.cnum);
       char* cnum1=new char[len1+1];
       strrev(a.cnum);
       for(i=0;i<MAX;i++)
       {
               if(b!=0)
               {
                       *(cnum1+i)=b%10+'0';
                   b=b/10;
               }
               if(b==0)
               {
                       *(cnum1+i)='0';
               }
       }
   for(i=0;i<len1;i++)
       {
               *(a.cnum+i+1)=(*(a.cnum+i)-'0'+*(cnum1+i)-'0')/10+'0';
       *(a.cnum+i)=(*(a.cnum+i)-'0'+*(cnum1+i)-'0')%10+'0';
       }
       *(a.cnum+len1+1)=0;
   strrev(a.cnum);
       delete []cnum1;
}
return a;
}

void main()
{
CHugeInt a("1234545436342424354354365289899834234235");
CHugeInt d(9999);
CHugeInt t1 = CHugeInt("100000088888888");
CHugeInt temp = t1 + 111112;                                    //这一行就有问题了

}

11 个解决方案

#1


具体什么问题啊,我去掉注释之后,简单改了改,可以运行啊,至少程序没崩溃:
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
const int MAX = 110;
class CHugeInt
{
private:
    int inum;
    char* cnum;
public:
    CHugeInt(char *num2,int num1=-1):cnum(num2),inum(num1) {}
    CHugeInt(int num1,char* num2=NULL):inum(num1),cnum(num2) {}
    CHugeInt(const CHugeInt &xxx)
    {
        inum=xxx.inum;
        cnum = new char[strlen(xxx.cnum) + 1];
        strcpy(cnum,xxx.cnum);
    }

    ~CHugeInt()     {
            if (cnum)
            delete []cnum;
    }

    friend ostream& operator<<( ostream&o,const CHugeInt& xx);
    friend CHugeInt operator+(const CHugeInt& temp,int b);
    friend CHugeInt operator+(int b,const CHugeInt& temp);
};

    CHugeInt operator+(const CHugeInt& temp,int b)
    {
        CHugeInt a=temp;
        if(a.cnum==NULL)
        {
            a.inum=b+a.inum;
            return a;
        }
        else
        {
            int i=0;
            int len1=strlen(a.cnum);
            char* cnum1=new char[len1+1];
            strrev(a.cnum);
            for(i=0; i<MAX; i++)
            {
                if(b!=0)
                {
                    *(cnum1+i)=b%10+'0';
                    b=b/10;
                }
                if(b==0)
                {
                    *(cnum1+i)='0';
                }
            }
            for(i=0; i<len1; i++)
            {
                *(a.cnum+i+1)=(*(a.cnum+i)-'0'+*(cnum1+i)-'0')/10+'0';
                *(a.cnum+i)=(*(a.cnum+i)-'0'+*(cnum1+i)-'0')%10+'0';
            }
            *(a.cnum+len1+1)=0;
            strrev(a.cnum);
            delete []cnum1;
        }
        return a;
    }


    int main()
    {
        CHugeInt a("1234545436342424354354365289899834234235");
        CHugeInt d(9999);
        CHugeInt t1 = CHugeInt("100000088888888");
        CHugeInt temp = t1 + 111112;                                    //这一行就有问题了
    }

#2


……楼上是怎么简单改了改的?
反正我原样复制是会程序崩溃

#3


to楼主。
从你的程序当中,看得出来你喜爱编程。
我可以帮你调试成不会出现程序崩溃,但这对你毫无益处!
我假设你是科班的(非科班的话你这种程序我应该表扬),如果你热爱编程的话,我说两句吧:

第一:你没有认真看书,类的概念含糊不清。
第二:你很浮躁,基本功没打好,什么是堆?什么是栈?什么是常量区?为什么要用友元?
第三:*(str+i)与str[i]有什么区别,各有什么好处与坏处?思考过吗?
第四:什么是面向对象?思考过吗?套用书本的答案是不负责任的回答!

建议:买本好书,认认真真把书本上的例题与习题敲两遍吧,这比你瞎搞好多了,希望对你有用。

#4


       CHugeInt(const CHugeInt &xxx)
       {
               inum=xxx.inum;
               cnum = new char[strlen(xxx.cnum) + 1];
               strcpy(cnum,xxx.cnum);
       }
这个地方都知道复制;为什么下面
CHugeInt(char *num2,int num1=-1):cnum(num2),inum(num1) {}
CHugeInt(int num1,char* num2=NULL):inum(num1),cnum(num2) {}
你不用呢;

#5


有几个地方访问越界了
for(i=0; i<MAX; i++)
你给cnum1只分配了len1+1,却让它访问到MAX

for(i=0; i<len1; i++)
            {
                *(a.cnum+i+1)=(*(a.cnum+i)-'0'+*(cnum1+i)-'0')/10+'0';
i=len1-1的时候 a.cnum+i+1就为a.cnum+len1,

#6


指针我几乎不用主要也是不太熟

#7


强烈建议楼主看看这个:
http://download.csdn.net/source/2270813

#8


selooloo 顶

#9


大家好,这几天忙,没上来看回帖,现在看了诸位了回帖非常感谢,尤其是3l和7l的网友给我帮助很大,我现在正在看7l推荐的电子书,积分容我看完再分配

多谢多谢

#10


CHugeInt(char *num2,int num1=-1):cnum(num2),inum(num1) {}

这样不行的,因为你直接保存了num2,如果num2不是new的怎么办?如果你是new的,但是在外部又delete掉它又怎么办?你在析构函数里再delete它,不就出问题了?

你必须重新分配一块内存给cnum,然后把num2的内容拷贝进去

#11


第三:*(str+i)与str[i]有什么区别,各有什么好处与坏处?思考过吗?
这个我也不知道。。谁有号地方可以看看的
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告