c - 将十六进制转换为二进制字符串时如何摆脱 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
解决方案
您的代码中有多个问题:
- 您不检查内存分配失败。
由于您为 分配了 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
type fori
,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;
}
推荐阅读
- android - 使用 AppsFlyer 链接安装 apk 但无法获取安装数量
- asp.net - 使用 Azure AD B2C 时,我应该在哪里存储我的 aspnet 核心网站的声明和角色
- c# - SemanticModel GetSymbolInfo().Symbol 在构造代码中为空,但在解析代码中为空
- openrefine - 总结Openrefine中列的所有记录?
- java - 访问受保护的方法
- nuxt.js - 如何在 nuxt 项目中禁用“no-unused-vars”规则
- java - 尝试在空对象引用上调用虚拟方法“void android.view.View.setOnClickListener(android.view.View$OnClickListener)”
- javascript - 如何使按钮成为 React with Material-UI 中隐藏输入的标签?
- node.js - 找不到信封的 pem:{"alg":"RS256","kid":"5a66482db3800c83c63","typ":"JWT"}
- azure-devops - Azure DevOps 中来自不同项目的团队