繁体   English   中英

C ++分段错误

[英]C++ segmentation fault

我是C ++的新手,它是编写和调试该语言所需的内存细微差别。 谁能告诉我下面的代码为什么给我分段错误?

string Polynomial::toString(){
    int i, exponent;
    stringstream result;

    for (i = 0; i < coeffs.size(); i++){

        // For first non-zero coefficient
        if (result.str().empty()){
            if(coeffs[i] < 0)
                result << "-";
            if(coeffs[i] != 0)
                result << coeffs[i];
        }
        else{
            if(coeffs[i] < 0)
                result << " - " << abs(coeffs[i]);
            else if(coeffs[i] > 0)
                result << " + " << coeffs[i];
        }

        exponent = (coeffs.size() - i - 1);
        if (coeffs[i] != 0){
            if (exponent > 1)
                result << coeffs[i] << "x^" << exponent;
            else if(exponent == 1)
                result << coeffs[i] << "x";
        }
    }

    result.str();
}

您可能正在调用该函数并将结果分配给某些对象:

Polynomial p = ....;
std::string s = p.toString();

由于您在Polynomial::toString()没有返回语句,该语句本身是未定义的行为,因此很容易导致分段冲突。 您可以通过返回stringstreams的`string轻松解决此问题:

return result.str();

您的函数缺少一个return语句(可能只是return部分)。 根据该标准,根据C ++ 11标准的6.6.2 / 2节(如下所示),除main以外具有返回类型的main上的任何函数都达到右括号是不确定的,尽管通常会导致崩溃它可能并不总是这样做。

除此之外,没有什么可能导致不确定的行为或崩溃。 您要做的是添加return部分:

return result.str();

值得一提的是,GCC 4.7.2发出以下警告:

警告:函数中没有return语句,返回非空[-Wreturn-type]

始终利用编译器可以并且会给您的警告。


标准参考:

流向函数的末尾等同于没有值的返回; 这导致返回值函数中的行为未定义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM