地址0x66超出范围

时间:2013-12-17 11:04:20

标签: c

closeTs中的{p> struct tic给了我一个错误 - tsP=0x66 <Address 0x66 out of bounds>。我尝试从oracle条目填充它,如果没有,我尝试分配一个值。但我在fillFields中错误地访问了它。有人能给我一个提示我该如何解决? 我已经削减了很多,但是这足以让我们解决问题:

typedef struct tic {
    char  closeTs[19];
    float close;
}tic, *ticP;

int buildQotHash(GTree* tree, char (*str)[3000])
{
    tic *t = malloc(sizeof(tic))  ;
    while (OCI_FetchNext(rs))
    {
        if (OCI_GetDate(rs, 4) != NULL) OCI_DateToText(OCI_GetDate(rs, 4), 
            "DD.MM.YYYY HH24:MI", 19, t->closeTs );
    }
} 
void fillField(char* match, double* pf, char* tsP, char* message )
{

}
void fillFields(tic *t )
{
    fillField( CLOSEVORTAG, &t->close, t->closeTs,"CLOSEVORTAG,             " );
}

void processXML(char *start, char *stop, GTree* t)
{
    tic *ti  ; 
    if (triP != NULL && (key = g_tree_lookup (t, triP))!= NULL ) ti = (ticP)key;
    fillFields(ti);
}

1 个答案:

答案 0 :(得分:2)

我觉得您发布的代码非常不完整,所以我在这里猜测...

在你的函数中processXML如果条件不满足会怎样?

void processXML(char *start, char *stop, GTree* t)
{
    tic *ti ; 
    if (triP != NULL && (key = g_tree_lookup (t, triP))!= NULL )
        ti = (ticP)key;
    //or else???
    fillFields(ti);
}

会发生ti未初始化的情况,因此任何使用它都会导致未定义的行为。你很幸运,你得到越界错误。

你可能想要的是:

void processXML(char *start, char *stop, GTree* t)
{
    //where is key declared, BTW???
    if (triP != NULL && (key = g_tree_lookup (t, triP))!= NULL )
    {
        tic *ti = (ticP)key;
        fillFields(ti);
    }
    // or else do nothing
}

这就是为什么我总是建议声明最接近其使用的变量。这种方式ti永远不会被初始化,因此你原来的错误是不可能的。