2015-01-19 5 views
0

Я пытаюсь получить двоичное представление большого целого в GMP. Я сохраняю 1 и 0 в массиве с именем expBinary. Я использую malloc для выделения памяти размера «int», затем используйте realloc, чтобы увеличить эту память всякий раз, когда добавляется новый бит. Преобразование работает без каких-либо проблем, но когда я пытаюсь выделить больше памяти с помощью malloc после цикла while, он дает мне ошибка сегментации, когда я вызываю тот же код второй раз, первый раз это дает мне отсутствие сегментации. Я проверил и «expBinary» это что-то из границ не хранить, я дал ниже кодОшибка распределения памяти в C

int binarySize = 0;               
int * expBinary = malloc(sizeof(int));         
int i = 0;                 

// Run until exp == 0              
while(mpz_cmp_ui(exp,0) != 0)            
{                   
    binarySize++;               
    expBinary = (int*) realloc(expBinary,(binarySize));      
    // Getting LSB of exp             
    if(mpz_even_p(exp) != 0)             
     expBinary[i] = 0;             
    else                  
     expBinary[i] = 1;                                 
    // Incrmenting variables             
    i++;                  
    // Dividing exponent by 2            
    mpz_tdiv_q_ui(exp,exp,2);            
}                   

// This line is giving error 
int * temp = malloc(sizeof(int)); 
+1

Это на linux? use [valgrind] (http://www.valgrind.org) –

+1

[Пожалуйста, не накладывайте результат 'realloc()'] (http://stackoverflow.com/questions/605845/do-i-cast- заместитель на результат из-таНоса/605858 # 605858). – Quentin

+0

Его в Mac (Unix), но я думаю, он будет работать так же в Linux. Я удалил бросок, но все еще показывал ту же ошибку. –

ответ

4

Если вы используете int массив, то это неправильно

expBinary = (int*) realloc(expBinary,(binarySize)); 

он должен быть

expBinary = realloc(expBinary, binarySize * sizeof(*expBinary)); 

или, что эквивалентно,

expBinary = realloc(expBinary, binarySize * sizeof(int)); 

Я предпочитаю sizeof(*expBinary) по понятным причинам, а также, если realloc() не удается вам сбросить ссылку на предыдущий указатель, так что я рекомендую этот

void *tmp; 
tmp = realloc(expBinary, binarySize * sizeof(int)); 
if (tmp == NULL) 
    handleFailureHereAndDontContinueToTheNextLineAndFree_expBinary_Please(); 
expBinary = tmp; 

Теперь, если вы хотите распечатать изображение с помощью любого printf("%s\n", expBinary); вы должны использовать char * вместо этого в этом случае вы должны считать, что sizeof(char) == 1 всегда, и вам понадобится один дополнительный байт в конце 1 и 0 со значением '\0'.

+0

Спасибо большое! Это сработало :) –

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