double free error with pointer to array of mpz_t

I'm currently learning libgmp and to that end I'm writing a small program which find prime factors. My program calls a function which fills an array with a varying amount of mpz_t integers, prime factors of a given number, which I need to return. I'm planning on setting the last element to NULL, so I know how many mpz_t integers the function found. My problem is I'm getting double free errors with my array of pointers to mpz_t integers. I've written up some sample code illustrating my problem: #include #include #include int main(void) { mpz_t *p = malloc(5*sizeof(mpz_t*)); mpz_init_set_ui(p[0], 2UL); mpz_init_set_ui(p[1], 5UL); gmp_printf("%Zd %Zd\n", p[0], p[1]); mpz_clear(p[0]); mpz_clear(p[1]); free(p); return 0; } 2 and 5 are printed to stdout, so allocation seems to be fine. But I'm getting the double free error below: 2 5 *** glibc detected *** ./lol: double free or corruption (out): 0x08e20020 *** ======= Backtrace: ========= /lib/libc.so.6(+0x6b6c1)[0xb77126c1] /lib/libc.so.6(+0x6cf18)[0xb7713f18] /lib/libc.so.6(cfree+0x6d)[0xb7716f8d] /usr/lib/libgmp.so.3(__gmp_default_free+0x1d)[0xb77f53fd] /usr/lib/libgmp.so.3(__gmpz_clear+0x2c)[0xb77ff08c] ./lol[0x80485e3] /lib/libc.so.6(__libc_start_main+0xe6)[0xb76bdb86] ./lol[0x80484e1] I'm still getting totally used to pointers, and gcc gives no errors, however I'm fairly sure this is wrong and I should be doing something like mpz_init_set_ui(*p[0], 2UL); instead of: mpz_init_set_ui(p[0], 2UL); But that gives me a compiler error test.c:8: error: incompatible type for argument 1 of ‘__gmpz_init_set_ui’ /usr/include/gmp.h:925: note: expected ‘mpz_ptr’ but argument is of type ‘__mpz_struct’ Anyway, my questions are: 1. I'm sure I should be dereferencing the pointer in the mpz_init_set_ui() call, why is that wrong? 2. Is there a better way of doing this? Should I use a linked list?(I've not learned linked lists yet, I figure an array is best for this but if I'm really making things way more difficult, tell me) 3.Would it be better to create a struct with a pointer to my array and another variable with the amount of elements in my array and return a pointer to that instead? The platform is linux 32-bit just in case that's relevant. Here is the code I have just now, which I want to modify, I declare the array of mpz_t on the stack. But I want to make main() a function: #include #include #include "prime.h" #define MAXFACTORS 100 int main(void) { mpz_t numToFactor, factor; mpz_t result;/* used to pass return values from getPrimeFactor() */ mpz_t primeFactors[MAXFACTORS]; mpz_init_set_str(numToFactor, "18 446 744 073 709 551 615 436 457 568", 10); mpz_init(factor); mpz_init(result); int pFLen = 0; mpz_init(primeFactors[pFLen]); getPrimeFactor(numToFactor, result); mpz_set(factor, result); while(mpz_cmp_ui(factor, 0UL)) { mpz_set(primeFactors[pFLen], factor); pFLen++; if(pFLen == MAXFACTORS) { puts("Ran out of space to store prime factors, quitting..."); } mpz_init(primeFactors[pFLen]); mpz_divexact(factor, numToFactor, factor); mpz_set(numToFactor, factor); getPrimeFactor(factor, result); mpz_set(factor, result); } mpz_set(primeFactors[pFLen], numToFactor); pFLen++; int i; for(i = 0; i < pFLen; i++) { gmp_printf("%Zd ", primeFactors[i]); } puts(""); mpz_clear(numToFactor); mpz_clear(factor); return 0; } Thanks in advance people,
could you post the rest of the code?

以上就是double free error with pointer to array of mpz_t的详细内容,更多请关注web前端其它相关文章!

赞(0) 打赏
未经允许不得转载:web前端首页 » CSS3 答疑

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

前端开发相关广告投放 更专业 更精准

联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏