gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:53:42 25 4
gpt4 key购买 nike

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

最佳答案

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

  • 您没有检查内存分配失败。
  • 由于您为 hexdec 分配了 9 个字节,因此 snprintf(hexdec, SIZE, "%08X", hex); 应该是

    snprintf(hexdec, 9, "%08X", hex);
  • 缺少 SIZE 的定义,以及 #include 行。发布显示违规行为的程序的完整源代码。

  • 不需要循环到字符串 hexdec 的末尾:因为您将 hex 值转换为 %08X ,只需循环:

    for (i = 0; i < 8; ++i) 
  • 在离开 convertBinary 函数之前,您应该free(hexdec)

  • 代码和注释在 int command = 10010100 中不一致;//这是十六进制,哪一个是错误的?可能两者都有。
  • i 不需要使用long 类型,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;
}

关于c - 将十六进制转换为二进制字符串时,如何摆脱 C 中的堆损坏错误(严重错误 c0000374)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55912668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com