Как избавиться от ошибки повреждения кучи (Critical error c0000374) в C при преобразовании шестнадцатеричной в двоичную строку? - PullRequest
3 голосов
/ 30 апреля 2019

Часть моего проекта, где мы должны взять входной файл с шестнадцатеричными числами и преобразовать их в код MIPS, я хочу преобразовать шестнадцатеричный код в двоичный, чтобы мне было проще преобразовать его в MIPS. Однако, когда я запускаю код, он падает и завершает работу, когда достигает части, где он вызывает функцию конвертера. GDB говорит, что это критическая ошибка c0000374. Как мне это исправить?

Я попытался дать целевой строке больше места, и это, похоже, не имеет никакого эффекта. Я также пытался использовать malloc безрезультатно.

char* convertBinary (int hex)
{
    char* hexdec = calloc(9, sizeof(char));
    char* bin = calloc(SIZE+1, sizeof(char));

    snprintf(hexdec, SIZE, "%08X", hex);

    long int i; 

    for (i = 0; hexdec[i]; ++i) 
    { 
        switch (hexdec[i])
        { 
            case '0': 
                strcat(bin, "0000"); 
                break; 
            case '1': 
                strcat(bin, "0001"); 
                break; 
            case '2': 
                strcat(bin, "0010");
                break; 
            case '3': 
                strcat(bin, "0011"); 
                break; 
            case '4': 
                strcat(bin, "0100");
                break; 
            case '5':
                strcat(bin, "0101"); 
                break; 
            case '6': 
                strcat(bin, "0110");
                break; 
            case '7':
                strcat(bin, "0111"); 
                break; 
            case '8': 
                strcat(bin, "1000");
                break; 
            case '9':
                strcat(bin, "1001"); 
                break; 
            case 'A': 
            case 'a':
                strcat(bin, "1010"); 
                break; 
            case 'B': 
            case 'b':
                strcat(bin, "1011"); 
                break; 
            case 'C': 
            case 'c':
                strcat(bin, "1100"); 
                break; 
            case 'D': 
            case 'd':
                strcat(bin, "1101"); 
                break; 
            case 'E': 
            case 'e':
                strcat(bin, "1110"); 
                break; 
            case 'F': 
            case 'f':
                strcat(bin, "1111"); 
                break; 
            default: 
                printf("\nInvalid hexadecimal digit %c", 
                    hexdec[i]); 
        } 
    }

    return bin;
}

Также, в случае, если это помогает, вот основная функция, где я вызываю эту функцию

int main ()
{
    int command = 10010100; //This is in hex   

    char* binaryString = convertBinary(command);
    printf("The coverted binary is: %s\n", binaryString);
}

Я ожидаю, что функция вернет строку двоичных чисел, которые были преобразованы из шестнадцатеричного числа из 8 цифр. Однако программа просто выходит и ничего не выводит. При отладке с помощью GDB выдает предупреждение:

warning: Critical error detected c0000374

1 Ответ

2 голосов
/ 30 апреля 2019

В вашем коде несколько проблем:

  • Вы не проверяете наличие ошибки выделения памяти.
  • Поскольку вы выделяете 9 байтов для hexdec, snprintf(hexdec, SIZE, "%08X", hex); должно быть

    snprintf(hexdec, 9, "%08X", hex);
    
  • Определение SIZE отсутствует, как и строки #include. Опубликуйте полный исходный текст программы, демонстрирующий оскорбительное поведение.

  • Нет необходимости зацикливаться до конца строки hexdec: поскольку вы конвертируете значение hex с помощью %08X, просто зациклите с:

    for (i = 0; i < 8; ++i) 
    
  • Вы должны free(hexdec) до выхода из функции convertBinary.

  • Код и комментарий не совпадают в int command = 10010100; //This is in hex, какой из них неправильный? Вероятно, оба.
  • Нет необходимости использовать тип long для i, достаточно будет int. И наоборот, аргумент hex должен иметь тип unsigned int.

Вот упрощенная версия вашего кода:

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

char *convertBinary(unsigned int hex) {
    char *bin = calloc(33, 1);
    int i;

    if (bin) {
        for (i = 32; i-- > 0;) {
            bin[i] = '0' + (hex & 1);
            hex >>= 1;
        }
    }
    return bin;
}

int main() {
    int command = 0x10010100; //This is in hex   

    char *binaryString = convertBinary(command);
    if (binaryString == NULL) {
        printf("Memory allocation failure\n");
    } else {
        printf("The converted binary is: %s\n", binaryString);
        free(binaryString);
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...