二维GMP整数矩阵循环运算出现段错误的解决方法求助
解决GMP二维矩阵循环多次后段错误的问题
问题根源:你在计算矩阵行指针时犯了指针运算的错误。代码里
my_matrix[i]=my_matrix[i-1]+(size*sizeof(mpz_t));这行是错的——mpz_t*类型的指针做加法时,偏移量的单位是**mpz_t元素的大小**,不是字节。你这里多乘了sizeof(mpz_t),导致每一行的起始地址严重越界,刚开始循环次数少的时候还没触发非法访问,次数多了之后mpz_t内部的内存管理被破坏,就出现了段错误。修正方案:把行指针的计算改成
my_matrix[i] = my_matrix[i-1] + size;,这样每一行的起始地址就是上一行起始地址加上size个mpz_t元素的长度,完全匹配你分配的连续内存块。修正后的完整代码:
#include <gmp.h> #include <stdio.h> #include <stdlib.h> int main() { const size_t size = 4 ; mpz_t **my_matrix; // 分配指针数组 my_matrix = malloc(size * sizeof(mpz_t*)); // 分配连续的mpz_t内存块 my_matrix[0] = malloc(size * size * sizeof(mpz_t)); // 修正行指针计算 for(int i = 1; i < size; i++) my_matrix[i] = my_matrix[i-1] + size; // 初始化每个mpz_t元素并设为1 for (int i = 0; i < size; i++) for (int j = 0; j < size; j++) { mpz_init(my_matrix[i][j]); mpz_set_ui(my_matrix[i][j], 1); } // 循环100次,每次乘以10 for (int exponent = 1; exponent < 100; exponent++) for (int i = 0; i < size; i++) for (int j = 0; j < size; j++) { mpz_mul_ui(my_matrix[i][j], my_matrix[i][j], 10); } // 清理mpz_t对象并释放内存 for (int i = 0; i < size; i++) for (int j = 0; j < size; j++) { mpz_clear(my_matrix[i][j]); } free(my_matrix[0]); free(my_matrix); return 0; }
- 额外提醒:程序结束时一定要用
mpz_clear清理每个mpz_t对象,再释放分配的内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Stef1611
相关产品推荐
相关产品推荐

