使用GMP整数时出现分段错误(核心转储)
Segmentation fault (core dumped) while using GMP Integers
我用c++编写了一个简单的程序,使用gmp库,打印出由1(如1,11,111,11111,11111,…)和2001组成的数的模数;问题是当程序达到1的23位数字时,我得到一个错误说分段故障(核心转储)。你能指出问题在哪里吗?下面是我的代码:
#include <iostream>
#include <stdio.h>
#include <string>
#include <gmpxx.h>
int main(int argc, char** args){
mpz_t currNumber;
mpz_init(currNumber);
mpz_set_str(currNumber, "1", 10);
while(mpz_sizeinbase(currNumber, 10) < 24){
char* digits = mpz_get_str(nullptr, 10, currNumber);
strcat(digits, "1");
mpz_set_str(currNumber, digits, 10);
digits = nullptr;
mpz_t r;
mpz_init(r);
mpz_set_str(r, "1", 20);
mpz_t divisor;
mpz_init(divisor);
mpz_set_str(divisor, "2001", 20);
mpz_mmod(r, currNumber, divisor);
std::cout << "====>" << currNumber << " mod(2001) = " << r << "nnn";
//Clean up
mpz_clear(r);
mpz_clear(divisor);
}
std::cout << "Went until " << mpz_sizeinbase(currNumber, 10) << " digits !" << "n";
///Clean up
mpz_clear(currNumber);
return 0;
}
第一个明显的bug是:
char* digits = mpz_get_str(nullptr, 10, currNumber);
strcat(digits, "1");
由mpz_get_str分配的缓冲区没有足够的空间让您将一个额外的字符连接到其内容上。
我想你可以用:
char* digits = mpz_get_str(nullptr, 10, currNumber);
std::string more_digits = std::string(digits) + "1";
free(digits);
mpz_set_str(currNumber, more_digits.c_str(), 10);
1)既然你是在c++中,你应该使用std::string来进行大多数字符串操作,而不需要学习使用C字符串的晦涩之处。
2)如果我正确地理解mpz_get_str(尽管我自己从未使用过它),你需要释放它分配的缓冲区(正如我在这个建议的代码中所做的那样),以避免内存泄漏。
相关文章:
- C++映射分割错误(核心转储)
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 分段错误(核心转储)但无法弄清楚
- 分段错误(核心转储) - 使用 SavedModel 的 Tensorflow C++ API 进行推断
- C++指针无法在函数外部传递值和分段错误(核心转储)错误
- 合并排序:分段错误核心转储
- C++:分段错误(核心转储)
- 从 pybind11 构建导入模块时出现"分段错误(核心转储)"
- qt C++命令行代码中的分段错误(核心转储)
- C++ atof - 分段错误(核心转储)
- 为什么我的代码包含错误分段错误(核心转储)?
- 运行编译的 a.out 后出现分段错误(核心转储)错误
- 运行我的代码时出现分段错误(核心转储)问题
- C++代码的分段错误(核心转储)
- 为什么我在执行main之前就出现分段错误(核心转储)
- OpenCV 分段错误(核心转储)在使用 cv::Mat::at 时
- 分段错误(核心转储) 重定向输入
- C++字符串中的分段错误(核心转储)
- 树实现给出分段错误(核心转储)错误 c++ 11