将十六进制转换为二进制字符串时,如何摆脱C中的堆损坏错误(严重错误c0000374)?

时间:2019-04-30 01:09:19

标签: c

我的项目的一部分,我们必须获取带有十六进制数字的输入文件并将其转换为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 个答案:

答案 0 :(得分:2)

您的代码中存在多个问题:

  • 您不检查的内存分配失败。
  • 由于您为hexdec分配了9个字节,因此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;
}