使用GMP库做大整数运算触发realloc未分配指针错误如何解决
错误原因
你新增的mpz_t d未初始化就直接参与运算,触发了内存访问异常。事实上你代码中最开始声明的a、b、c三个变量同样没有做初始化操作,之前未崩溃属于未定义行为的侥幸情况,不符合GMP库的使用规范。
GMP库要求所有mpz_t类型的大整数变量,使用前必须先调用初始化函数,使用结束后需要调用清理函数释放内存。
解决方法
步骤1:补全所有变量的初始化和清理逻辑
所有mpz_t变量声明后先调用mpz_init()完成初始化,程序退出前调用mpz_clear()释放内存。
步骤2:可选优化mpz_get_str的内存释放
mpz_get_str第一个参数传NULL时会自动申请堆内存存储字符串,使用后需要主动free避免内存泄漏。
修正后的完整代码
#include<stdio.h> #include<stdlib.h> #include<gmp.h> int main (){ mpz_t a, b, c, d; // 初始化所有大整数变量 mpz_init(a); mpz_init(b); mpz_init(c); mpz_init(d); mpz_set_ui(a,0); mpz_set_ui(b,0); mpz_set_ui(c,0); mpz_set_str(a, "23", 10); mpz_set_str(b, "35", 10); char *str; str = mpz_get_str (NULL, 10, a); printf("%s\n", str); free(str); str = mpz_get_str (NULL, 10, b); printf("%s\n", str); free(str); str = mpz_get_str (NULL, 10, c); printf("%s\n", str); free(str); mpz_mul(c,a,b); str = mpz_get_str (NULL, 10, c); printf("%s\n", str); free(str); mpz_mul(d,c,c); str = mpz_get_str (NULL, 10, d); printf("%s\n", str); free(str); // 释放所有大整数占用的内存 mpz_clear(a); mpz_clear(b); mpz_clear(c); mpz_clear(d); return 0; }
编译运行
依旧使用原命令即可正常执行:gcc so.c -lgmp && ./a.out
运行后会新增输出648025,也就是805的平方运算结果。
内容的提问来源于stack exchange,提问作者ecjb
相关产品推荐
相关产品推荐

