我在QT项目中使用GMP,我正在尝试使用QByteArray存储一些数字。
当我想将字节数组转换为mpz_t时,我正在执行以下操作:
const char *hexstring = qbyteval.toHex().toStdString().c_str();
mpz_t myval;
mpz_init (myval);
mpz_set_str(myval, hexstring, 16);
mpz_t zero;
mpz_init(zero);
mpz_set_str(zero, "0", 10);
if(mpz_comp(myval, zero) == 0) {
//...set a breakpoint or do something here. This line shouldn't be reached ever.
}
就我而言,qbyteval
永远不会为零。如果我在mpz_comp if block中设置断点,则qbyteval.toHex()始终是十六进制字符串。
什么是失败,导致hexstring为空字符串(因此myval = 0)?
答案 0 :(得分:7)
这看起来不对:
c_str()
std::string
函数返回指向std::string
中内部数据的指针,如果修改或销毁std::string
,该指针可能会失效。在这种情况下,$( document ).ready(function() {
if( $('#masthead').hasClass('header-fixed') ) {
$('.bdanzer-fixed').addClass('bdanzer-show');
} else {
$('.bdanzer-fixed').removeClass('bdanzer-show');
}
});
会在该行运行后立即销毁,因为您没有将其存储在变量中。
您的代码中可能会出现更多这样的错误,但这是最明显的错误。如果您仍有问题,我建议发布一个最小的完整示例,并更好地解释预期行为与实际行为,并使用调试器来查看每行上发生的情况。
答案 1 :(得分:0)
要从字节数组中获取const char*
,您必须确保缓冲区不是临时的,并且比指针的所有使用都要长:
void function(const QByteArray & byteVal) {
auto const hex = byteVal.toHex();
mpz_t myval;
mpz_init (myval);
mpz_set_str(myval, hex.data(), 16);
...
}
答案 2 :(得分:0)
这为我解决了。我没有初始化myval。
mpz_t myval;
mpz_set_str(myval.backend().data(), hexstring, 16);