Распределение памяти и утечка проблема? - PullRequest
0 голосов
/ 06 мая 2019

Я работаю над функцией print_selected(int x), которая принимает x, затем извлекает биты 5, 6, 7 и 8 (начиная с бита 0 справа) затем распечатайте их в обоих двоичных файлах, затем в шестнадцатеричном формате.

Существует вспомогательная функция, int2bin(int n) в функции print_selected(int x) и int2bin(int) возвращает массив типов символов в s.

Проблема в том, что я могу правильно распечатать двоичное число битов 5, 6, 7 и 8 бит, однако шестнадцатеричное число возвращает какое-то странное число (из-за проблемы утечки памяти?). Я сильно сомневаюсь, что char* s = int2bin(x) и free(s) в print_selected(int) могут быть проблемой, но я не знаю, в какую часть я должен внести изменения, чтобы правильно распечатать правильное шестнадцатеричное число.

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

// takes integer and returns char array with 32 binary number.
char* int2bin(int n)  
{
    int nbits = sizeof(n) * 8;
    char *s = malloc(nbits + 1);

    s[nbits] = '\0';

    unsigned int u = *(unsigned int*)&n;
    int i;
    unsigned int mask = 1 << (nbits - 1);
    for (i = 0; i < nbits; i++, mask >>= 1)
        s[i] = ((u & mask) != 0) + '0';
    return s;
}

// takes an integer and print in "binary" and "hexadecimal".
void print_selected(int x) 
{
    int hex[4];  // to store the 4 bits of (5,6,7,8) 
    int i;

    char *s = int2bin(x); //  I think this part makes problem?

    printf("bits 5 to 8 in bin: ");
    for (i = 23; i <= 26; i++)
    {
        printf("%d", s[i] - '0');
        hex[i] = s[i] - '0';
    }

    free(s); // I think this part makes problem?

    printf("\n");

    int j = 3; // since we already know the number of bits,
    int sum = 0;

    for (i = 0; i <= 3; i++)
    {
        sum = sum + (hex[i] * pow(2, j));
        j--;
    }

    printf("in hex: 0x%x\n", sum);
}

int main(void)
{
    int a = 278;
    print_selected(a);
}

Ответы [ 2 ]

2 голосов
/ 06 мая 2019

однако шестнадцатеричное число возвращает какое-то странное число (из-за проблемы утечки памяти?).

нет, вы получаете доступ к неинициализированной памяти в

for (i = 0; i <= 3; i++)
{
    sum = sum + (hex[i] * pow(2, j));
    j--;
}

, поскольку hex инициализируется только в

for (i = 23; i <= 26; i++)
{
   printf("%d", s[i] - '0');
   hex[i] = s[i] - '0';
}

, то есть для индексов с 23 по 26, а не для индексов с 0 по 3

обратите внимание, что вы также пишете из hex , с неопределенным bahevior, вам нужно использовать индекс i -23 для записи hex

такзначение сумма не определено

Я рекомендую вам использовать valgrind для выявления проблем с памятью, я использовал его, чтобы ответить вам

2 голосов
/ 06 мая 2019

Проблема здесь:

    for (i = 23; i <= 26; i++)
    {
        printf("%d", s[i] - '0');
        hex[i] = s[i] - '0';
    }

hex индексы идут от 0 до 3, поэтому присвоение hex[23] вызывает неопределенное поведение.Затем вы пытаетесь распечатать элементы hex, которые вы никогда не заполняли.

Вам нужно:

hex[i - 23] = s[i] - '0';
...