2016-11-12 8 views
0

я построить программу, которая перевода базы 10 ти основание 2 и основание 16:бесплатно() функция работает оленья кожа

#include <stdio.h> 

int main(void) 
{ 
    int b10, b2, b16; 
    scanf("%d", &b10);//getting a number in base 10 
    b16 = b10; 
    b2 = b10; 

    //******print the number in base 2 
    int* ba2 = (int*)malloc(b10/2*4); 
    int i = 0,j; 
    while (b2 > 0){ 
     ba2[i] = b2 % 2; 
     b2=b2/2; 
     i++; 
    } 
    for (j = i-1; j >= 0; j--){ 
     printf("%d", ba2[j]); 
    } 
    free(ba2); 
    //************************** 

    //******print the number in base 16 
    printf("\n"); 
    int* ba16 = (int*)malloc(b10/16 * 4); 
    i = 0; 
    while (b16 > 0){ 
     ba16[i] = b16 % 16; 
     b16 = b16/16; 
     i++; 
    } 
    for (j = i - 1; j >= 0; j--){ 
     if (ba16[j] < 10) 
      printf("%d", ba16[j]); 
     else 
      printf("%c", 'A' + (ba16[j] - 10)); 
    } 
    free(ba16); 
    //**************************** 

    getch(); 
    return 0; 
} 

по какой-то причине остановки программы на второй бесплатно(). , когда я создал точку прерывания, программа просто остановилась, когда я добрался до бесплатного, никакого сообщения или предупреждения. Может кто-нибудь мне помочь?

+0

Я предлагаю вам рассчитать количество элементов массива в переменной и проверить 'i' на это. –

+2

Например, когда 'b10 = 10',' int * ba16 = (int *) malloc (b10/16 * 4); '==>' int * ba16 = malloc (0); '==>' ba16 [0] = b16% 16; '==> overflow ==> destroy malloc structure ==> не может освободиться. – BLUEPIXY

+0

У вас нет чека, чтобы i или j не превышали пределы массивов. – user3344003

ответ

0

Вы выделяете память как ba10/16 * 4. Для входных значений меньше 16, что равно нулю. В соответствии с документацией malloc вы либо получите нулевой указатель, либо уникальный указатель, который можно передать бесплатно. Но вы назначаете значения в ba16 [0]. То же самое верно для входного значения 16. Вы выделили 4 байта. Но программа продолжает назначать ba16 [0] и ba16 [1], что приведет к повреждению массива. Та же проблема существует и с ba2. Я не знаю, были ли вы протестированы с входными значениями менее 16 или 2. Надеюсь, это поможет.

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