You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 08:36:04