用cout打印时出现分段错误

时间:2013-03-10 12:51:29

标签: c++ segmentation-fault

我即将解决这个分段错误。我正在写一个简单的2通道汇编程序。剥离中间文件以获取操作码,符号表条目等工作正常。我现在正在将机器代码缓冲区打印到控制台,但是有些东西导致了分段错误。

#include"./assembler.h"
using namespace std;

int main(void)
{
ifstream inf("pooltab");
int pooltab[10],pooltab_ptr=0;

while(true)
{
    int x;
    inf>>x;
    if(inf.eof()) break;
    pooltab[pooltab_ptr++] = x;
}
for(int i=0;i<pooltab_ptr;i++)
    cout<<pooltab[i]<<endl;
pooltab_ptr = 0;
inf.close();

inf.open("intermediate.asm");
//  ofstream outf("machine_code");  
    sym_tab symtab;
literal_tab littab;

symtab.create_tab();
littab.create_tab();

char buf[50],*token,*m_code_buf,ch;
int loc_cntr=0,id,ltrl,a,b;

while(true)
{
    inf.getline(buf,50);
    if(inf.eof()) break;
    token = strtok(buf,"(), ");
    if(token != NULL)
    {
        if(token[0] == 'A' && token[1] == 'D')
        {
            token = strtok(NULL,",)");
            if(token == NULL)
            {
                cerr<<"null token error";
                return -1;
            }
            id = atoi(token);
            if(id == 1 || id == 2)
            {
                token = strtok(NULL,",() C");
                                    if(token == NULL)
                {
                    cerr<<"null token error";
                    return -1;
                } 
                loc_cntr = atoi(token);
            }
        }

        if(token[0] == 'I' && token[1] == 'S')
        {
            token = strtok(NULL,",)");
            if(token == NULL) 
            {
                cerr<<"null token error";
                return -1;
            }
            id = atoi(token);
            if(id == 10 || id == 11)
            {
                token = strtok(NULL,"S,() ");
                if(token == NULL)
                { 
                    cerr<<"null token error";
                    return -1;
                }
                a = atoi(token);
                a = symtab.get_addr(a);
                sprintf(m_code_buf,"%03d) + %02d 0 %03d\n",loc_cntr,id,a);  
                cout<<m_code_buf;
            }
            else if(id == 1)
            {
                sprintf(m_code_buf,"%03d) + %02d 0 000\n",loc_cntr,id);
                printf("%s",m_code_buf);
            }
            else if(id > 1 || id < 10)
            {
                token = strtok(NULL,"() ");
                if(token == NULL)
                { 
                    cerr<<"null token error"; 
                    return -1;
                }
                a = token[0] - 48;
                token = strtok(NULL," (,");
                if(token == NULL)
                {
                    cerr<<"null token error"; 
                    return -1;
                }
                ch = token[0];
                printf("%d %d %c \n",id,a,ch);
            }

            loc_cntr++;
        }
    }
}
inf.close();
//  outf.close();

return 0;
}

这是我在中间代码文件中检查命令式语句(IS,1) (1) (S,1)的方式。错误发生在sprintf。现在,当我对代码进行更改时,故障似乎从一个地方跳到另一个地方。 防爆。我曾经使用cout代替printf。然后sprintf就好了,但是cout产生了错误。然后我改变了pooltab的生成方式,现在sprintf是麻烦制造者。

4 个答案:

答案 0 :(得分:2)

我猜测m_code_buf未初始化或太小。

答案 1 :(得分:1)

if(token == NULL) cerr<<"null token error";
a = atoi(token);

如果tokenNULL,您刚刚将NULL传递给atoi ...

答案 2 :(得分:1)

数组和指针不一样。

目前,您已将m_code_buf定义为指向char的指针:

char *m_code_buf;

那是只是一个指针。它并不指向任何地方。它没有指向char个对象。你无法开始对它进行处理,因为它实际上指向任何有效的char对象。仅仅因为类型告诉你它将指向char,并不意味着它会自动执行。

将其更改为:

char m_code_buf[256];

这会为您提供一个char数组。它实际上在内存中分配256个char大小的对象供您使用。然后可以将其传递给sprintf

m_code_buf这里不是指针。但是,在许多上下文中,数组的名称会隐式转换为指向其第一个元素的指针。这就是为什么你可以开始将数组的名称视为一个指针,即使它不是

答案 3 :(得分:0)

这可能只是意味着你想写的比你的缓冲区更多。它会让你在别人的记忆中写下来(段错)。