功能在独立模式下工作正常,但在较大的程序中不能正常工作

时间:2013-07-28 19:49:41

标签: c function segmentation-fault

我有一个包含多个标头和源文件的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]。

2 个答案:

答案 0 :(得分:0)

您的第一个问题可能在于滥用pow来计算2的幂和计算可能遇到的溢出。

计算2的整数幂的正确方法是移位运算符,这里将是

2u << (n-1-i)

后缀u是为了确保其类型正确(unsigned)。但是你还必须确保你移动的值不是太大,你必须保证相应的功率仍然适合unsigned。您没有告诉我们您的架构是什么,并非所有架构都有unsigned 32位。

然后你的LoadMemory功能看起来也很虚伪。据我所知,无法保证addr(您没有显示类型)小于4096

答案 1 :(得分:0)

使用unsigned int addr = bus32toint(line);