2015-04-22 8 views
1

Я новичок в программировании на C, и я не смог найти решение моей проблемы. Несмотря на то, что код работает (я был в состоянии включить его в другой программе), когда он пытается освободить память, назначенный calloc(), он возвращает следующую ошибку:Освобождение массива mpc_t в C

free(): invalid next size (normal): 

followd тем, что, как представляется, адрес памяти. Я использую библиотеки mpc (для произвольных точных комплексных чисел). Это самая маленькая программа, которая повторяет ошибку:

#include <stdio.h> 
#include <stdlib.h> 
#include <gmp.h> 
#include <mpfr.h> 
#include <mpc.h> 

int N = 10; 
int precision = 512; 

int main(void) { 
    mpc_t *dets2; 
    dets2 = (mpc_t*)calloc(N-2,sizeof(mpc_t)); 

    for (int i = 0; i<=N-2; i++) { 
     mpc_init2(dets2[i],512); //initialize all complex numbers 
     mpc_set_str(dets2[i],"1",0,MPFR_RNDN); //set all the numbers to one 
    } 

    free(dets2); //release the memory occupied by those numbers 
    return 0; 
} 

Благодарим за помощь!

+4

Условие в вашем цикле for должно быть 'i mch

+3

@mch - хороший улов; ваш комментарий должен быть ответом. –

+0

Спасибо @mch! Это решает проблему. Итак, что я пытаюсь сделать с моим ошибочным кодом - хранить N-1 mpf_t в пространстве, которое может обрабатывать только N-2 mpf_t. Я думал, что это вызовет ошибку сегментации или что-то в этом роде. –

ответ

2

Ваш забойный цикл после i == N-2, но он должен сломаться раньше. Условие в вашем цикле for должно быть i<N-2 вместо i<=N-2.

Итак, вы пытаетесь получить доступ к памяти, которая находится за пределами. Это приводит к undefined behaviour, поэтому все может случиться, включая ошибку сегментации, ошибку свободного времени выполнения или ничего.

+0

Спасибо! В следующий раз я буду более осторожен. –

Смежные вопросы