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);
}
答案 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
永远不会被初始化,因此你原来的错误是不可能的。