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