代码之家  ›  专栏  ›  技术社区  ›  Ankit Rohilla

C++运算符重载导致分段错误

  •  -2
  • Ankit Rohilla  · 技术社区  · 9 年前

    下面是给出分段错误的代码,我不知道是什么原因。在试图重载^运算符时,我遇到了分段错误。

    这是我的代码。

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    class bigint {
    
        public:
    
        char val[1000000];
        int msdindex;
        bool iszero;
    
        bigint( int i ) {
            if( i == 0 )
                iszero = true;
            else {
                iszero = false;
                msdindex = -1;
                while( i > 0 ) {
                    msdindex++;
                    val[ msdindex ] = i % 10;
                    i /= 10;
                }
            }
        }
    
        bigint( const bigint& bi ) {
            msdindex = bi.msdindex;
            iszero = bi.iszero;
            for( int i = 0; i <= msdindex; i++ )
                val[i] = bi.val[i];
        }
    
    };
    
    bigint operator^( bigint k, int n ) {
    
        if( n == 1 )
            return bigint(k);
    
        bigint half = k^(n/2);
    
        return half;
    
    }
    
    int main()
    {
        bigint bi = bigint( 999 );
        bigint di = bi ^ 4;
        return 0;
    }
    

    分段错误在重载函数中,我不知道原因。gdb这样说。

    回溯(最近一次调用): 文件“/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19-gdb.py”,第63行 从libstdcxx.v6.printers导入寄存器libstdcxx_printers ImportError:没有名为“libstdcxx”的模块

    程序接收信号SIGSEGV,分段故障。 运算符^(bigint,int)()中的0x0000000000400749

    请帮忙。

    1 回复  |  直到 9 年前
        1
  •  1
  •   instance    9 年前

    内存不足,因此程序每次都会崩溃。将bigint中的char的状态分配减少到较小的值将很好。 或者使用动态内存分配,以防您需要巨大的字符数组,这将解决您的问题。 希望这有帮助。

    class bigint {
    
        public:
    
        char *val;//[1000000];
        int msdindex;
        bool iszero;
    
        bigint( int i ) {
            if( i == 0 )
                iszero = true;
            else {
                iszero = false;
                msdindex = -1;
                val = new char[1000000];
                while( i > 0 ) {
                    msdindex++;
                    val[ msdindex ] = i % 10;
                    i /= 10;
                }
            }
        }
    
        bigint( const bigint& bi ) {
            msdindex = bi.msdindex;
            iszero = bi.iszero;
            val = new char[1000000];
            for( int i = 0; i <= msdindex; i++ )
                val[i] = bi.val[i];
        }
    
    };
    

    不要忘记为此编写析构函数以释放动态分配的内存。干杯