我有一个包含多个标头和源文件的c程序。在运行时,程序会给出分段错误。在使用“up”和“print variable”命令时,我认为函数“busntoint()”无法正常工作。
我有以下函数将长度为n的字符串从二进制转换为十进制:
unsigned int busntoint(int n, busn bus)
{
unsigned int value = 0;
int i;
for (i=0; i < n; i++) {
if (bus[i] == '1') value += (unsigned int)pow(2,(n-1-i));
}
return value;
}
unsigned int bus2toint(bus2 bus)
{
return busntoint(2, bus);
}
unsigned int bus32toint(bus32 bus)
{
return busntoint(32, bus);
}
然后我编写了另一个程序来检查这些函数的工作情况。它工作正常,并提供正确和预期的输出。我不知道为什么它在“更大”的程序中不能正常工作。
如果它有用,以下是变量的定义:
typedef char bus2[3];
typedef char bus3[4];
typedef char bus5[6];
typedef char bus6[7];
typedef char bus8[9];
typedef char bus16[17];
typedef char bus32[33];
“更大”程序中该功能的用法如下:
int LoadMemory(char * binfilename, bus8 memory[4096])
{
//some code
int addr = bus32toint(line);
setbit8(memory[addr], &line[33]);
//some code
}
gdb中的p addr给出了垃圾值,导致内存中的分段错误[addr]。
答案 0 :(得分:0)
您的第一个问题可能在于滥用pow
来计算2的幂和计算可能遇到的溢出。
计算2的整数幂的正确方法是移位运算符,这里将是
2u << (n-1-i)
后缀u
是为了确保其类型正确(unsigned
)。但是你还必须确保你移动的值不是太大,你必须保证相应的功率仍然适合unsigned
。您没有告诉我们您的架构是什么,并非所有架构都有unsigned
32位。
然后你的LoadMemory
功能看起来也很虚伪。据我所知,无法保证addr
(您没有显示类型)小于4096
。
答案 1 :(得分:0)
使用unsigned int addr = bus32toint(line);