首页 > 解决方案 > 将十六进制转换为二进制字符串时如何摆脱 C 中的堆损坏错误(严重错误 c0000374)?

问题描述

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

标签: c

解决方案


您的代码中有多个问题:

  • 您不检查内存分配失败。
  • 由于您为 分配了 9 个字节hexdecsnprintf(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,哪一个是错的?大概两者兼而有之。
  • 不需要使用longtype for iint就足够了。相反,参数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;
}

推荐阅读